将列与可能为空(或不为空)的值进行比较的最简单方法



我有一个准备好的SQLite声明…

SELECT * FROM a WHERE col1 = $someValue

但是当someValuenull时,查询不返回行,所以我这样写…

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

无论someValue是否是null,这个查询都可以完美地工作,但是它非常冗长。是否有更简单或更简洁的方法来实现相同的目标?

从操作符和影响解析的属性:

IS和IS NOT操作符的工作方式类似于=和!=,除了其中一个或两个操作符的操作数为NULL。在这种情况下,如果两个操作数都为NULL,然后是运营商的求值结果为1(真正的)和运营商计算结果为0 (false)。如果一个操作数为NULL而另一个不是,则IS操作符的计算结果为0 (false),而IS NOT操作符为1(真正的)。is或is not表达式不可能

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

SELECT * FROM a WHERE col1 IS $someValue;

如果你想使用postgresis distinct from,我猜他们有,因为很多人都有同感:

SELECT * FROM a WHERE col1 is not distinct from $someValue
与<<p> strong> sqlite 应该可以这样写:
SELECT * FROM a WHERE col1 is $someValue OR col1 = $someValue 

这可能是最短的了。

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

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

传递给ifnull函数的第二个参数,在本例中是x,是一个数据库中没有的值,col1$someValue是varchar列。