【问题标题】:Is there a SQL value "DifferentThan" comparison method是否有 SQL 值“DifferentThan”比较方法
【发布时间】:2011-08-18 16:53:17
【问题描述】:

我确信在 SQL 中存在类似“DifferentThan”的方法。
我不是在寻找 <> 运算符,这将导致 NULL 比较失败。

例如,想象一个可为空的位列。

当检查“不正确”时,我可以这样做

WHERE COALESCE(myBit,0) = 0

也许这是最好的方法...我对此并不感兴趣。我特别试图记住诸如“DIFFERENTTHAN”之类的语法

WHERE myBit DIFFERENTTHAN 1

编辑:我在下面回答了我自己的问题。

【问题讨论】:

  • 您使用的是什么 SQL 方言?我见过的解决问题的唯一方法是 COALESCE 技巧,正如你所说,这是你想要避免的。
  • @Joel Brown 我不想避免 COALESCE,但更想记住我以前见过的这种特殊语法。
  • FWIW,我从没听说过这样的关键字。

标签: sql syntax null compare


【解决方案1】:

语法是

IS [NOT] DISTINCT FROM

在 ANSI 标准中但包含在 MSSQLServer 中

http://www.sqlmag.com/article/sql-server/is-not-distinct-from

【讨论】:

    【解决方案2】:

    对于标准 ANSI/ISO SQL,空行为是相当严格定义的。简而言之:

    • 所有涉及NULL 值的表达式都计算为NULLcoalesce() 除外。

    • 所有涉及NULL 值的测试都失败,除了无效性的显式测试。以下失败:

      • X = null
      • null = null
      • X < null

      本质上,NULL 是一个位于变量域之外的值。这意味着逆比较运算符不是对称的 WRT 到 NULL

    以下所有表达式,如果涉及到 null,则失败并且 null 值通过。

    * `X < null`
    * `X >= null`
    * `X > null`
    * `not ( X > null )`
    * etc.
    
    In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`.
    

    在您的情况下,如果值为 null,则要使测试成功,您可以执行以下操作:

    • where ( A = B or B is null )。 如果 A 为空且 B 为非空,或者 A 和 B 为非空且比较不相等,这将失败。如果 A 和 B 不为 null 且比较相等,或者 B 为 null,则成功。
    • where A = coalesce(B,A)。这与上述表达式的行为相同。我更喜欢它,因为语法更简洁。

    请注意,某些 SQL 实现允许与标准不同的空行为(例如,MS/Sybase Transact-SQL 可以选择允许使用标准比较运算符测试空性,并允许空 char/varchar表现得好像它们是 nil(空)字符串。在 SQL Server 的早期版本中,通过使列可变长度来实现空值,而不管其类型如何。空值以零长度存储。对于char/@987654336 @fields,一个 nil(空)字符串被存储为一个空格。不完全直观。作为副作用,像 foo char(8) null 这样的声明相当于声明它 foo varchar(8) null

    即使您的 SQL 实现支持非标准的 null 行为,您也应该避免它,并将其编码为具有 ANSI null 行为的标准 SQL。在大多数支持非标准空行为的实现中,该行为可通过运行时选项进行配置。无论您是否在标准 ANSI 空值行为下运行,您的标准编码都会产生相同的结果。

    【讨论】:

    • 您的回答似乎与 Itzik Ben-Gan 在我的回答中发布的链接中提出的解决方案形成对比。
    • 因为我从未在野外看到 IS DISTINCT FROM 的实现—SQL Server、DB2 和 Oracle 都不支持它—我必须将那个特定的 SQL99 语言特性归档为“拥有它会很高兴”。由于我无法像大多数人一样编写利用假设语言特性的代码,因此我只能使用 IS [NOT] NULL 的复合条件来实现我想要的行为。
    【解决方案3】:

    你可以试试这个

    WHERE NOT myBit = 1
    

    这不是单个运算符,但比使用 COALESCE 更干净。

    【讨论】:

    • 这也不起作用。它以与&lt;&gt; 相同的方式失败NULL 比较。测试:SELECT 'test' WHERE NOT 1 = NULL
    • NULL = 1 的计算结果为 false,这给了我们 NOT FALSE,即 TRUE。因此它对 1 以外的任何值都返回 TRUE。
    • 我相信三值逻辑,NULL = 1 计算结果为 NULL。
    猜你喜欢
    • 2010-09-07
    • 2012-04-19
    • 2011-03-02
    • 2011-05-11
    • 2017-10-05
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多