代码之家  ›  专栏  ›  技术社区  ›  Nerd in Training

带有可为空参数的SQL Where

  •  0
  • Nerd in Training  · 技术社区  · 5 年前

    我有一个SQL查询,需要根据以下可能性返回行:

    ReqType
    ------
    NULL
    LTL
    TL
    

    为了更好地了解我想要实现的目标:

    SELECT * FROM MyTable MT
    WHERE MT.ReqType = @param1
    

    正在传递的参数是@ param . @param的可能性可以为空、tl或ltl。

    @ 帕拉姆 ReqType nvarchar(3)

    3 回复  |  直到 5 年前
        1
  •  2
  •   Gordon Linoff    5 年前

    NULL 不适用于 = ,因此您需要更明确的逻辑:

    WHERE (MT.ReqType = @param1 OR
           (MT.ReqType IS NULL AND @param1 IS NULL)
          )
    
        2
  •  2
  •   DaniDev    5 年前

    如果 @param1 (可以是) SQL NULL 然后你也可以这样做:

    SELECT * FROM MyTable MT
    WHERE isnull(MT.ReqType, '')  =  isnull(@param1,'') 
    

    *如果您允许mt.reqtype使用空字符串,那么这将不起作用。在这种情况下,您可以选择另一个字符来替换空值。

        3
  •  1
  •   vscoder    5 年前

    工作原理和Gordon的一样,稍微紧凑一点,注意使用coalesce。我不认为这是索引友好的,所以您可能需要小心使用它。

    declare @test table 
    ( 
        ReqFld1 varchar(4),
        ReqType varchar(3)
    )
    
    insert into @test values ('FLD1', 'LTL')
    insert into @test values ('FLD2', 'TL')
    insert into @test values ('FLD3', NULL)
    
    declare @srch varchar(3)
    
    select @srch = null
    select * from   @test 
    where  coalesce(ReqType, '') = (coalesce(@srch, ''))
    
    select @srch = 'LTL'
    select * from   @test 
    where  coalesce(ReqType, '') = (coalesce(@srch, ''))
    
    select @srch = 'TL'
    select * from   @test 
    where  coalesce(ReqType, '') = (coalesce(@srch, ''))