2010-08-03 87 views
2

SQL語法卻仍然是我學習。我得到了這個代碼片段下面指出的錯誤。TSQL CASE LTRIM(RTRIM NULL

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. 

我在做什麼錯了?我如何保留聲明的要點,而不是得到這個瘋狂的錯誤?

回答

1

發生這種情況時,它不能推斷類型。

例如

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)*/ 
1

您需要將NULL轉換爲匹配整體值的正確類型,例如CONVERT(VARCHAR(10), NULL),否則s erver不能推斷出哪種類型可以產生結果值。

+0

或CAST(NULL AS VARCHAR(10)); – a1ex07 2010-08-03 17:40:58

+0

@ a1ex07 - Ack ...陷入了Sybase的心態 – DVK 2010-08-03 17:42:21

+0

啊,好吧,我明白了。我嘗試了一些其他的東西,發現它的工作原理如下:CASE LTRIM(RTRIM(cLehmanNo))=''那麼當cLehmanNo不爲NULL時,則爲NULL然後替換(cLehmanNo,SUBSTRING(cLehmanNo,PATINDEX('%[^ a-zA -Z0-9''''']%',cLehmanNo),1),'')END作爲LOAN_NUMBER(必須在=符號後移除一個額外的空格,然後我在代碼的後面找到了我必須在END之前添加THEN REPLACE(Null,'',''),如下所示:,CASE WHEN LTRIM(RTRIM(dtMicIssue))=''那麼NULL當cMICNumber不爲NULL,則REPLACE(NULL,'' '')END MIP_CERTIFICATION_DATE Thx! – JMS49 2010-08-03 18:01:43

1

錯誤消息實際上意味着在你case表達式的一個結果全部null。你有這樣的表達:

case when something then null when something then null end 

至少其中一個結果有可能比其他0​​東西。你可以繞過這個,但很可能在查詢中有一個錯誤,因爲始終返回相同結果的case展示是毫無意義的。

錯誤消息has been changed到:

至少在一個CASE規範結果的表達式 之一必須是大於NULL 常數以外的 表達。

+0

+1我認爲如果所有部分都返回NULL常量,那麼在查詢中肯定有錯誤 – 2010-08-03 17:48:15

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 
+0

添加Else''不會產生任何影響我認爲這不會引發錯誤'SELECT CASE WHEN 1 = 2 THEN NULL 2 = 3 THEN REPLACE(NULL,','')END' – 2010-08-03 18:00:50