【问题标题】:CASE SQL returning NullCASE SQL 返回 Null
【发布时间】:2012-02-07 10:38:35
【问题描述】:

当我在 TSQL 中执行以下命令时,即使有值,我也会得到 NULL

这是我的代码:

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

为什么会这样?

【问题讨论】:

  • 给我们一些行来检查信息
  • F.e.如果 WEPHWORK.WEPHWORK 为 NULL,则总和也将为 null。尝试使用类似 ISNULL(WEPHWORK.WEPHWORK,'') + ISNULL(...
  • WEPHWORK 3 OCESAWD 2 OCESAWE 10. WEPHWORK 不是 NULL 并且有一个值

标签: sql tsql case


【解决方案1】:

您知道您的 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 填充规则...?

【讨论】:

    【解决方案2】:

    很可能是因为您的值中至少有一个是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
    

    【讨论】:

    • 是的,我在特定列中有一些 NULL,但对于其他行而不是这一行。
    • 你能为我们截取特定的行吗?
    • 现在我明白为什么了。当我添加一个为 0 的字段时,它会将其视为 NULL。因此我得到 NULL 回来。将 0 转换为 NOT NULL 的任何快速方法?还是我必须在上述情况下这样做?
    • 除非你告诉他们数据类型是什么,否则人们很难说出来
    • 零通常不被视为 NULL,不确定那里发生了什么。
    猜你喜欢
    • 2021-07-13
    • 2015-12-30
    • 1970-01-01
    • 2022-10-13
    • 2011-06-07
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多