我有一个准备好的SQLite声明…
SELECT * FROM a WHERE col1 = $someValue
但是当someValue
是null
时,查询不返回行,所以我这样写…
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;
如果你想使用postgres有is 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列。