我试图写下这样的话:
SELECT Id FROM SomeTable
WHERE
CASE WHEN (@param IS NULL) THEN
1
ELSE
CONTAINS([FullText],@param)
END = 1
但我似乎无法让SQL Server抱怨语法。有没有办法使用CASE来短路CONTAINS搜索?
即使做这样的事情似乎也没有短路:
CASE WHEN (@param IS NULL) THEN
1
ELSE
(CASE WHEN CONTAINS([FullText], @param ) THEN
1
ELSE
0
END)
END = 1
答案 0 :(得分:1)
如果您查看执行计划,可以看到case
已转换为一系列if... else
,其中两个部分都已执行。
似乎避免执行不良部分的唯一方法是
if @param is null
select * from myTable
else
select * from myTable
where <expensive condition check>
答案 1 :(得分:1)
只需简化您的查询:
SELECT Id FROM SomeTable
WHERE @param IS NULL OR CONTAINS([FullText],@param)
因此,如果@param为NULL,则不会检查第二个条件(短路)
答案 2 :(得分:0)
由于sql server不保证短路条件,你可以这样做以避免空谓词错误:
SELECT Id
FROM SomeTable
WHERE @param IS NULL
OR CONTAINS([FullText], ISNULL(@param, 'a'))
这样,如果@param
为空,则不会出现错误。但是我对性能不太了解 - 如果没有短路条件,这意味着where子句的两个部分都可能会评估,这可能需要一段时间。