代码之家  ›  专栏  ›  技术社区  ›  Martin

检查输入参数(如果不为空)并在SQL Server的where中使用它

  •  33
  • Martin  · 技术社区  · 15 年前

    WHERE 子句,如果为空则排除它?

    我相信有很多种方式,但那时我似乎记不起来了。

    我也可以用 COALESCE() ? 但我认为这只是为了选择价值观?

    编辑

    为了澄清,假设一个变量 @code ="1" 那我在哪 Where type='B' AND code = @code 但是如果 @code is null 那我只想 Where type='B' -注意失踪的人 code = @code .

    7 回复  |  直到 7 年前
        1
  •  68
  •   Klaus Byskov Pedersen    15 年前

    你可以用 IsNull

     where some_column = IsNull(@yourvariable, 'valueifnull')
    

    编辑 :

    你在评论中所描述的可以这样做:

    where (@code is null or code = @code)
    
        2
  •  9
  •   Paul Alan Taylor    15 年前

    这是另一种方法

    SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
    

    如果参数为空,则不会计算或表达式的其余部分。

        3
  •  9
  •   Adriaan Stander    15 年前

    怎么样

    WHERE (Column1 = @Var1 OR @Var1 IS NULL)
    AND (Column2 = @Var2 OR @Var2 IS NULL)
    
        4
  •  6
  •   DForck42    15 年前

    看看这篇整洁的文章 here . 它解释了为什么“where(@param为空或Field=@param)”不能很好地执行,以及如何使用它。

        5
  •  5
  •   Andrew Barber Eric Lafortune    13 年前

    我想提出一个我在另一个 site :

    SELECT * FROM Thingies 
    WHERE ThingID = isnull(@ThingId,ThingID)
    

    如果用户选择 null 对于参数,查询将返回结果中的所有行。

        6
  •  3
  •   Philip Derbyshire    11 年前

    这个问题真的帮助我解决了一个类似的问题,我们中的一些人对此有些挠头。我只是在别人尝试同样的方法,却不明白为什么不起作用的情况下写出来。

    如果@Parameter不为空,我试图只计算multipart WHERE子句的一部分。我尝试按如下方式执行此操作,但如果@Parameter为空,则始终没有返回行。

    DECLARE @Parameter int = null;
    
    SELECT  *  FROM  TABLE
    WHERE   [AlternateID] is not null 
            AND (@Parameter is not null AND [AlternateID] = @Parameter)
    

    我错误地认为 (@Parameter is not null AND [AlternateID] = @Parameter) 不会构成完整WHERE子句is@Parameter was null的一部分。但是它使整个WHERE子句返回false。补救方法是添加或1=1,如下所示:

    WHERE   [AlternateID] is not null 
            AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
    

    当然,阿里概述的方法(没有足够的声誉来提升投票率)更有效地解决了这个问题。

    WHERE   [AlternateID] is not null 
            AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
    
        7
  •  1
  •   Sadhir    15 年前

    您可以使用ISNULL(),或者像其他人提到的那样显式检查null。只要您没有超过1个或2个可选输入参数,这应该是可以的。但是,如果有更多的参数,这种方法将非常低效,因为您在这些列上创建的索引不会像您预期的那样使用。在这种情况下,我建议您使用动态SQL。这里有一篇很好的文章解释了为什么 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

    推荐文章