只有在传递参数具有值时才能在Where子句中使用'Exists'

时间:2009-08-14 00:52:41

标签: sql sql-server tsql

我在存储过程中有一个像下面那样的选择(为简洁起见缩短了)。 @param是存储过程的参数,可以为NULL。

SELECT name FROM Table1 WHERE EXISTS(select table from table2 Where param = @param AND ... AND ...) AND ... AND ...

我希望只有在@param有值时才使用EXISTS语句(粗体部分),否则忽略它。

如果可能,我不想使用动态SQL或临时表。我试图使用CASE语句来处理EXISTS语句,但运气不好。

2 个答案:

答案 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子句。