SQL语法仍然是我正在学习的东西。我收到了下面这段代码的错误。
SELECT
CASE WHEN LTRIM(RTRIM(cLehmanNo)) =' ' THEN NULL
WHEN cLehmanNo IS NOT NULL THEN REPLACE ( cLehmanNo,SUBSTRING (cLehmanNo,PATINDEX( '%[^a-zA-Z0-9 '''''']%',cLehmanNo),1), ' ' )
END asLOAN_NUMBER
,CASE WHEN LTRIM(RTRIM(cMERS)) =' ' THEN NULL
WHEN cMERS IS NOT NULL THEN REPLACE ( cMERS,SUBSTRING (cMERS,PATINDEX( '%[^a-zA-Z0-9 '''''']%',cMERS),1), ' ' )
END asMERS_ID
还有100多个相同的。
Msg 8133, Level 16, State 1, Line 1
None of the result expressions in a CASE specification can be NULL.
我做错了什么?我如何保持声明的要点而不是出现这个疯狂的错误?
答案 0 :(得分:1)
您需要将NULL转换为与整体值匹配的正确类型,例如CONVERT(VARCHAR(10),NULL),否则服务器无法推断出哪个类型可以产生结果值。
答案 1 :(得分:1)
当它无法推断出类型时会发生这种情况。
e.g。
SELECT CASE WHEN 1 = 2 THEN NULL ELSE NULL END
但这有效
SELECT CASE WHEN 1 = 2 THEN NULL ELSE replace(NULL,'','') END
因此我怀疑错误来自您向我们展示的代码(您正在使用字符串函数,以下快速测试表明它将假定为varchar(8000)
)
SELECT CASE WHEN 1 = 2 THEN NULL ELSE REPLACE(NULL,'','') END a
INTO t /*Creates column of datatype varchar(8000)*/
答案 2 :(得分:1)
错误消息实际上意味着您case
个表达式中的所有结果均为null
。你有一个表达式:
case when something then null when something then null end
至少有一个结果必须是null
以外的其他结果。你可以绕过这个,但很可能在查询中有一个错误,因为总是返回相同结果的case
外推是没有意义的。
错误消息has been changed:
至少有一个结果表达式 在CASE规范中必须是 NULL以外的表达式 恒定。
答案 3 :(得分:0)
SELECT
CASE WHEN LTRIM(RTRIM(cLehmanNo)) =' ' THEN NULL
WHEN cLehmanNo IS NOT NULL THEN REPLACE ( cLehmanNo,SUBSTRING (cLehmanNo,PATINDEX( '%[^a-zA-Z0-9 '''''']%',cLehmanNo),1), ' ' )
ELSE ''
END asLOAN_NUMBER
,CASE WHEN LTRIM(RTRIM(cMERS)) =' ' THEN NULL
WHEN cMERS IS NOT NULL THEN REPLACE ( cMERS,SUBSTRING (cMERS,PATINDEX( '%[^a-zA-Z0-9 '''''']%',cMERS),1), ' ' )
ELSE ''
END asMERS_ID