2012-02-07 57 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填充规则...?