我有一个过程,该过程接受选项字段数据的XML字符串,并在用户传递任何内容时将值存储在临时表中。
例如,如果用户选择了他们想要按Country
和Department
进行搜索,那么这些临时表将包含City
为空的数据。
我要做的是创建一个where clause
,它将使用这些临时表中的数据作为其逻辑。
INSERT INTO @users(QID)
SELECT QID
FROM Employees AS e
WHERE e.AreaID IN ( SELECT AreaID FROM @areas )
AND e.SiloID IN ( SELECT SiloID FROM @silos);
但是,在这种情况下,如果@silos
为空,我不希望它成为逻辑的一部分,并且应该包含e.SiloID
为任何内容的数据。
示例:
1,5,7
NULL
查询将是:
SELECT QID
FROM Employees
WHERE e.AreaID IN ( SELECT AreaID FROM @areas )
AND e.SiloID = <anything here, we ignore this logic because the temp table was empty>;
答案 0 :(得分:2)
每个where条件都应该检查值是否在临时表或中,临时表是否为空。这将创建一个“条件过滤器”,只有在临时表中包含记录时才会缩小结果。
INSERT INTO @users(QID)
SELECT QID
FROM Employees AS e
WHERE (
-- Areas
NOT EXISTS (SELECT AreaID FROM @areas)
OR e.AreaID IN ( SELECT AreaID FROM @areas )
)
AND (
-- Silos
NOT EXISTS (SELECT SiloID FROM @silos)
OR e.SiloID IN ( SELECT SiloID FROM @silos )
);
继续使用此模式以保留剩余条件。
答案 1 :(得分:0)
您可以使用其他人在评论中提到的rowcount变量,或者您可以内联执行:
AND (
e.SiloID IN ( SELECT SiloID FROM @silos)
OR NOT EXISTS(SELECT SiloID FROM @silos)
);