【问题标题】:Why do NULL fields get called equal?为什么 NULL 字段被称为相等?
【发布时间】:2011-10-10 20:08:22
【问题描述】:

我正在编写触发器来检测数据库中字段的变化,看来我必须做一些非常讨厌的事情,比如

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new)
or ((SELECT SalesPrice FROM __old) IS NULL and (SELECT SalesPrice FROM __new) IS NOT NULL)
or ((SELECT SalesPrice FROM __old) IS NOT NULL and (SELECT SalesPrice FROM __new) IS NULL)

而不仅仅是

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new)

准确检测字段是否更改。

我是否遗漏了什么,或者 Advantage 是否有效地声称 NULL == 任何值?这种行为有充分的理由吗?这是 SQL 定义中的一些奇怪的事情吗?有没有一种更简洁的方法可以不进行 3 次检查来代替 1 次检查?

【问题讨论】:

    标签: advantage-database-server


    【解决方案1】:

    不幸的是,这就是 SQL 处理 NULL 值的方式。 NULL 不等于任何东西,它是 UNKNOWN。例如, somevalue == NULL -> 未知 somevalue NULL -> 未知

    因此它永远不会通过“真实”检查 Null Values - Wikipedia

    有几个选项: A)不允许空值(我建议将其与默认值结合使用) B) 使用 IFNULL 将字段设置为某个值,例如

    (SELECT IFNULL(SalesPrice, -9999) FROM __OLD) <> (SELECT IFNULL(SalesPrice, -9999) FROM __NEW)
    

    但我不知道我是否一定喜欢这样,因为必须选择一个无效的值。

    【讨论】:

    • 这并不不幸;这很有意义。如果两列没有值,那些不存在的值如何比较相等?你会发现与 IEEE NaN 值相同。
    • @Tomalak 我的问题是,当列 NULL 时,SQL 有效地表示它等于一切。我知道 SQL 不完全是一种编程语言,但很多语言都假设 NULL == NULL ,这样您就可以从可能弹出 NULL 的比较中获得合理的结果。
    • @Edgar - 是的,在某些情况下不允许空值可能会起作用,但 0 和未决定之间存在差异(例如)。但是,如果 IFNULL 会很好用,因为我可以很容易地找到合适的无效值在比较中使用。谢谢。
    • @EricG:不不不。大多数语言都假设NULL != NULL,这是编程的基石。您必须停止将NULL 视为价值;其实是缺少一个
    • 对于许多应用程序来说,缺少一个值是一个极其重要的、可衡量的值。现在,也许我错了,但在 C、C++、C#、java 中,php null == null 返回 true。 C#:stackoverflow.com/questions/4077418/does-null-null
    【解决方案2】:

    在 SQL 中,NULL 不与任何东西进行比较,除了 IS [NOT] NULL 表达式。如果我正确理解您的问题,这里的问题是 NULL 必须等于 NULL。如果是这种情况,检查可能会简化为:

    ( SELECT CASE WHEN n.SalesPrice IS NULL and o.SalePrice IS NULL THEN TRUE
             ELSE n.SalesPrice = o.SalesPrice END
      FROM __old o, __new n )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 2010-12-22
      • 2023-03-24
      • 2010-10-12
      • 1970-01-01
      • 2011-01-13
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多