大选择中的多个where语句

时间:2018-10-11 09:46:53

标签: sql sql-server if-statement null where

我有2个搜索参数。

  • 我什么也不能传递,然后必须从DB获取所有行。     或者我可以传递Param1并获得ADB.param1=param1

  • 所在的行
  • 或者我可以传递Param2并获得ADB.param2=param2

  • 所在的行
  • 或者我可以传递Param1和Param2并获得ADB.param1=param1 and ADB.param2=param2

  • 所在的行

让我们想象一下,我有类似的数据库

CarColor,CarType,CarEngineVolume,CarMakeName param1是CarColor param2是CarType 如果我选择DB而没有发送参数,则必须获取整个行列表

  

红色,轿车2.0,本田
  蓝色,轿车,3.0,宝马
  绿色,皮卡,4.0,福特

如果我仅发送param2,例如“轿车” 我必须得到以下列表

  

红色,轿车,2.0,本田

     

蓝色,轿车,3.0,宝马

但是如果我同时发送两个参数,例如param1“ red”和param2“ sedan” 那么我只能得到1行

  

红色,轿车,2.0,本田

如果我在where里只处理一个参数

WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1))

然后,当我发送param1时,如果param1为null并且可以,那么我只会得到一行,并且所有行都将显示

但是当我添加第二个参数检查

    WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1)) 
AND (BDB.param2 = COALESCE(@param2 , BDB.param2))  )

仅发送param1时我什么也没得到。 但是我仍然必须获得1行。但是什么也没得到:(

2 个答案:

答案 0 :(得分:1)

使用OR代替AND

WHERE (   (ADB.param1 = COALESCE(@param1, ADB.param1)) 
OR (BDB.param2 = COALESCE(@param2 , BDB.param2))  )

答案 1 :(得分:0)

您可以使用它。

WHERE ( ( @param1 IS NULL OR ( ADB.param1 = @param1 )) 
    AND ( @param2 IS NULL OR ( BDB.param2 = @param2 ))
    AND ( ADB.param1 IS NOT NULL OR ADB.param2 IS NOT NULL ) )