TSQL CASE LTRIM(RTRIM NULL

时间:2010-08-03 17:24:49

标签: sql null case

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.

我做错了什么?我如何保持声明的要点而不是出现这个疯狂的错误?

4 个答案:

答案 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