【问题标题】:Simplest way to compare column against a value that may (or not) be null将列与可能(或不)为空的值进行比较的最简单方法
【发布时间】:2021-12-02 01:18:12
【问题描述】:

我有一个准备好的 SQLite 语句...

SELECT * FROM a WHERE col1 = $someValue

但是当someValuenull 时,查询不会返回任何行,所以我写了这个...

SELECT *
FROM a
WHERE (
    col1 = $someValue OR
    (
        $someValue IS NULL AND
        col1 IS NULL
    )
)

无论someValue 是否为null,此查询都能完美运行,但它非常冗长。 有没有更简单或更简洁的方法来实现相同的目标?

【问题讨论】:

    标签: sql sqlite node-sqlite3


    【解决方案1】:

    如果您要使用 postgres,那么有 is distinct from,我猜他们有它,因为很多人都喜欢您:

    SELECT * FROM a WHERE col1 is not distinct from $someValue
    

    使用 sqlite 应该可以编写:

    SELECT * FROM a WHERE col1 is $someValue OR col1 = $someValue 
    

    这可能已经很短了。

    【讨论】:

      【解决方案2】:

      来自Operators, and Parse-Affecting Attributes

      IS 和 IS NOT 运算符的工作方式与 = 和 != 类似,除非其中一个或两个都使用 的操作数为 NULL。在这种情况下,如果两个操作数都是 NULL, 然后 IS 运算符计算为 1(真)和 IS NOT 运算符 计算结果为 0(假)。如果一个操作数为 NULL 而另一个不是, 然后 IS 运算符的计算结果为 0(假)并且 IS NOT 运算符为 1(正确)。 IS 或 IS NOT 表达式不可能 评估为 NULL。

      您也可以使用运算符IS 来比较非空值:

      SELECT * FROM a WHERE col1 IS $someValue;
      

      【讨论】:

      • 当然,我早该想到的 :)
      【解决方案3】:

      不像forpas的回答那么优雅,但值得一提的另一种选择:

      SELECT * FROM a WHERE ifnull(col1, 'x') = ifnull($someValue, 'x')
      

      其中传递给ifnull 函数的第二个参数,在本例中为x,是数据库中尚不存在的值,col1$someValue 是varchar 列。

      【讨论】:

      • 如果传递给ifnull 的两个参数都是null,那么查询将不会按预期运行。 ifnull(null, null) 返回 null,因此需要与 IS 进行比较,而不是 =
      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多