此TSQL查询中的语法错误在哪里?

时间:2011-11-18 17:27:35

标签: tsql

以下TQL查询是从我正在使用的工具生成的,但是当它被执行时,“LIKE”附近会出现语法错误。我似乎无法弄清问题是什么。有人知道什么是错的吗?

SQL Management Studio中的错误是“消息156,级别15,状态1,行17”关键字“LIKE”附近的语法不正确。“

SELECT COUNT_BIG(*)
FROM [HistoryReport] AS t0
WHERE (1 <> 0 AND 


    (CASE WHEN (
                (CASE WHEN (t0.[CategoryValue] IS NULL) 
                    THEN NULL 
                    ELSE LOWER(t0.[CategoryValue]) 
                END) IS NULL
        ) 
        THEN NULL 
        ELSE (
            (CASE WHEN (t0.[CategoryValue] IS NULL) 
                THEN NULL 
                ELSE LOWER(t0.[CategoryValue]) 
            END) LIKE 'U' + '%'     
        )
    END) <> 0) 

1 个答案:

答案 0 :(得分:0)

一些事情,你正在测试一个值是否为null,并且如果是,则返回null,如果不是则返回值,这似乎很奇怪。然后,您将在代码分支中再次检查空值,该代码分支仅在值绝对不为空时才执行。有点不必要而且非常混乱。此外,我怀疑您与NULL的比较不会像您认为的那样,因为NULL <> 0默认会评估为NULL

顺便说一句:通常,在SQL SERVER中,字符串不区分大小写(除非您使用区分大小写的排序规则来配置列或服务器,这在某种程度上并不常见。)

我正在努力弄清楚你的意思,这是我认为你想要做的语法正确的版本:

SELECT COUNT_BIG(*)
FROM [HistoryReport] AS t0
WHERE (1 <> 0 AND LOWER(t0.categoryValue) like 'U' + '%')

基本上,您的查询指出如果t0.categoryValuenull,则返回null,否则将t0.categoryvalue转换为小写,并使用like与'{%}进行比较'如果LIKE比较返回true,则返回true。上面的查询完成了同样的事情。

如果您没有使用区分大小写的排序规则,则可以删除LOWER(),因为它只会增加成本并阻止任何索引使用。

现在,在SQL Server的世界中NULL意味着“未知”,因此询问“此未知值= 0”只能给出“我不知道”的答案。这让很多人感到困惑,因为他们希望“NULL == NULL”在某些语言中有效,但在SQL Sever中,你基本上会问“这个未知值是否与其他未知值相同”,答案是:未知。

所以我想我唯一的后续问题是,你想如何处理空值?

此外,对于您的原始问题,您LIKE 'U' + '%'之类的表达似乎不喜欢处于CASE语句中。

BOL表示语法为:

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
Searched CASE expression:
CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END

那:

  

那么result_expression是表达式返回的时候   input_expression等于when_expression求值为TRUE,或   Boolean_expression的计算结果为TRUE。结果表达式是有效的   表达

你对LIKE所拥有的内容似乎应该是一个有效的表达式,但似乎LIKE位于有效操作符的边缘。