我正在尝试使用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))
但那并不能归还我期待的结果......有什么想法吗?
答案 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)
);