"!="/NOT 可能在 SQLite 中无法正常工作

"!="/NOT perhaps not working properly in SQLite

我有一个 table 大约有一百行。它有一个包含 1、0 或 NULL 的列 is_gallery。如果我这样做...

 SELECT * WHERE is_gallery != 1

 SELECT * WHERE NOT (is_gallery = 1)

它排除了 is_gallery 为空的行。如果我这样做,我可以设法得到适当的回应

 SELECT * WHERE (is_gallery = 0 OR is_gallery is null)

但是“!=”或“NOT”不应该起作用吗?有没有办法只 return is_gallery 不等于 1 的行而不测试所有其他可能性?

您可以使用 IS and IS NOT 运算符代替 =!=。这些将 NULL 视为正常值。

SELECT * FROM yourTable WHERE is_gallery IS NOT 1

最好使用的是 coalesce,如:

SELECT * 
WHERE coalesce(is_gallery,0) != 1;

coalesce 的作用是用第二个参数替换该列中的任何空值。在上面的示例中,"is_gallery" 列中的任何空值在与 1 进行比较之前将被替换为 0。当然 return 也是如此。

NULL 上意识到 NULL 值不等于任何东西 - 甚至不等于 NULL 本身。它无法比较 - 所以当 "comparing" 时,它总是 return FALSE。在 NULL 上,它有一个特殊的运算符,即 "IS NULL""IS NOT NULL"