我在存储过程中有一个像下面那样的选择(为简洁起见缩短了)。 @param是存储过程的参数,可以为NULL。
SELECT name FROM Table1 WHERE EXISTS(select table from table2 Where param = @param AND ... AND ...) AND ... AND ...
我希望只有在@param有值时才使用EXISTS语句(粗体部分),否则忽略它。
如果可能,我不想使用动态SQL或临时表。我试图使用CASE语句来处理EXISTS语句,但运气不好。
答案 0 :(得分:7)
在WHERE子句中使用OR很可能会非常慢,特别是如果EXISTS。
其他选择......
Union:只有一个会返回行
SELECT name FROM Table1 WHERE EXISTS (select .... from table2 Where param = @param AND ... AND ...) AND ... AND ...
UNION ALL
SELECT name FROM Table1 WHERE @param IS NULL AND ... AND ...
条件分支:
IF @param2 IS NULL
SELECT name FROM Table1 WHERE ... AND ...
ELSE
SELECT name FROM Table1 WHERE EXISTS (select .... from table2 Where param = @param AND ... AND ...) AND ... AND ...
答案 1 :(得分:2)
WHERE (@Param IS NULL OR EXISTS (SELECT .... ))
请注意,这不是保证 - 查询优化器将按照自己的意愿执行操作。但是应该足够聪明以优化exists子句。