2012-02-07 88 views
2

當我在TSQL中執行以下時,即使有值,我也會得到NULLCASE SQL返回空

這裏是我的代碼:

CASE 
    WHEN cal.Weekday = ' ' OR HOLIDAY.DateInfo > ' ' 
     THEN WEPHWORK.WEPHWORK + OCESAWD.OCESAWD + OCESAWE.OCESAWE 
    ELSE OCESAWD.OCESAWD + OCESAWE.OCESAWE 
END as weighted 

這究竟是爲什麼?

+2

給我們一些行來檢查信息 – 2012-02-07 10:40:20

+0

F.e.如果WEPHWORK.WEPHWORK爲NULL,則和也將爲null。 (WEPHWORK.WEPHWORK,'')+ ISNULL(... – cycaHuH 2012-02-07 10:40:25

+0

WEPHWORK 3 OCESAWD 2 OCESAWE 10. WEPHWORK不是NULL並且具有值 – user1143563 2012-02-07 10:44:15

回答

4

很可能是因爲您的至少一個值是NULL

在T-SQL的基本規則是:

NULL + anything = NULL 

要檢查爲什麼它返回NULL,請嘗試以下SQL塊的。它會顯示所有你的價值,所以你可以看到爲什麼NULL正在返回。

SELECT * 
FROM (
    SELECT WEPHWORK.WEPHWORK, 
     OCESAWD.OCESAWD, 
     OCESAWE.OCESAWE, 
     CASE 
      WHEN cal.Weekday = ' ' OR HOLIDAY.DateInfo > ' ' 
       1 
      ELSE 2 
     END as type 
     CASE 
      WHEN cal.Weekday = ' ' OR HOLIDAY.DateInfo > ' ' 
       THEN WEPHWORK.WEPHWORK + OCESAWD.OCESAWD + OCESAWE.OCESAWE 
      ELSE OCESAWD.OCESAWD + OCESAWE.OCESAWE 
     END as weighted 
    FROM your_tables....) x 
WHERE x.weighted IS NULL 
+0

是的我在某個列中有一些NULL,但是對於其他行,而不是這一個 – user1143563 2012-02-07 11:11:05

+0

你可以爲我們截圖特定的行嗎? – 2012-02-07 11:14:46

+0

現在我明白了爲什麼當我添加一個字段爲0時,它將它視爲一個NULL,因此我得到NULL返回任何快速的方式來轉換0 NOT NULL?或者我必須在上面的條件下執行它嗎? – user1143563 2012-02-07 11:29:05

6

你知道你的SQL真值表嗎?

(NULL = ' ') --> UNKNOWN 
(NULL > ' ') --> UNKNOWN 
((NULL = ' ') OR (NULL > ' ')) ---> (UNKNOWN OR UNKNOWN) --> UNKNOWN 
(('x' = ' ' ) OR (NULL > ' ')) ---> ( FALSE OR UNKNOWN) --> UNKNOWN 
((' ' = ' ' ) OR (NULL > ' ')) ---> ( TRUE OR UNKNOWN) --> TRUE 

最後一種情況通常可以把人趕出去。

你也知道你SQL填充規則...?