CASE SQL返回Null

时间:2012-02-07 10:38:35

标签: sql tsql case

当我在TSQL中执行以下操作时,即使有值,我也会获得NULL

这是我的代码:

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

为什么会这样?

2 个答案:

答案 0 :(得分: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填充规则吗?

答案 1 :(得分: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