如果参数不为null,请检查ColumnA的值是否在ColumnB中(SQL-Server)

时间:2016-07-18 13:08:50

标签: sql-server tsql

我正在尝试使用sql语句来检查我函数中的参数是否为null。如果它为null,则它不应该执行任何其他操作,但如果它不为null,则应检查一列中的某个值是否出现在另一列中。

所以它应该是那样的

SELECT * FROM TableA 
WHERE User IN (SELECT User FROM TableB WHERE Condition = @ParameterA) 
AND File IN (SELECT File FROM TableB WHERE Condition = @ParameterB)

所以,我现在想要的是检查@ParameterA是否为空。如果是,则不应执行User IN [...],如果@ParameterB为空,则不应执行File IN [...]

我尝试过这样的事情:

WHERE (@paramA IS NULL AND A.User = A.User)
OR (@paramA IS NOT NULL AND A.User IN (Select User FROM TableB WHERE Condition = @paramA))
AND(@paramB IS NULL AND A.File = A.File)
OR (@paramB IS NOT NULL AND A.File IN (Select File FROM TableB WHERE Condition = @paramB))

但那并不能归还我期待的结果......有什么想法吗?

3 个答案:

答案 0 :(得分:4)

也许是这样的

SELECT * FROM TableA 
WHERE (@ParameterA IS NULL OR  User IN (SELECT User FROM TableB WHERE Condition = @ParameterA)) 
  AND 
      (@ParamterB IS NULL OR File IN (SELECT File FROM TableB WHERE Condition = @ParameterB))

如果给定的param为空OR IN条件已满,则第一个条件为真。第二个条件相同......由于组合AND

,两者都必须为真

答案 1 :(得分:0)

您通常会使用case语句,但由于您要在where子句中比较多个值,因此使用IN我会在语句的开头检查它。另外,你说如果参数是NULL,它应该什么都不做,因此像WHERE @ParameterA is null or User in ...这样的东西不适合你的解决方案,因为如果它是NULL它将返回所有内容..

IF @ParameterA IS NOT NULL AND @ParameterB IS NOT NULL
BEGIN

SELECT * FROM TableA 
WHERE User = IN (SELECT User FROM TableB WHERE Condition = @ParameterA) 
AND File IN (SELECT File FROM TableB WHERE Condition = @ParameterB)

END
ELSE BEGIN
SELECT 'Your Param is NULL'
END

答案 2 :(得分:0)

最常用的方法是添加一个检查变量是否为空或值。就像Shnugo的回答一样。

但你也可以通过添加一个将NULL参数默认为字段的COALESCE来解决这个问题。

SELECT * 
FROM TableA a
WHERE [User] IN (
         select distinct [User] FROM TableB 
         WHERE Condition = COALESCE(@ParameterA, Condition)
)
AND [File] IN (
         select distinct [File] FROM TableB 
         WHERE Condition = COALESCE(@ParameterB, Condition)
);