短路在哪里使用CASE包含CONTAINS

时间:2016-05-18 03:04:52

标签: sql sql-server sql-server-2012

我试图写下这样的话:

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

3 个答案:

答案 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子句的两个部分都可能会评估,这可能需要一段时间。