我在COLUMN1 CHAR(1)
中有MYTABLE
,其中所有行都是NULL
,这是我的SQL查询:
SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A'
它不会返回任何内容,因为NULL
中的所有行都有COLUMN1
。我想它应该归还一切。我如何使其工作?我不想使用
COALESCE(NULLIF(COLUMN1, ''), '*')
因为它会降低查询速度。还有其他选择吗?
答案 0 :(得分:3)
如果你真的想要NULL,那么为什么不呢
SELECT COLUMN1 FROM MYTABLE WHERE (COLUMN1 != 'A' OR COLUMN1 IS NULL)
???
答案 1 :(得分:2)
你的假设是错误的。基本上所有NULL
的比较运算符都返回" false"或NULL
(已在WHERE
子句中过滤掉),IS NULL
和IS NOT NULL
除外。
所以,你的查询应该是:
WHERE column1 <> 'A' OR COLUMN1 IS NULL
或者,使用COALESCE()
(不是NULLIF()
:
WHERE COALESCE(column1, '') <> 'A'
答案 2 :(得分:1)
考虑NULL
的语义。你可以按照你想要的方式使用它,但它意味着&#34;未知&#34;。未知=&#39; A&#39;?不。但不知道!=&#39; A&#39;?不。我们根本不知道它是什么,所以几乎所有的比较都会失败。
您可以使用IS NULL
和IS NOT NULL
这两个旨在与NULL
配合使用的特殊运算符。所以你可以这样做:
SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A' OR COLUMN1 IS NULL
但首先要问问自己:这是你想要的吗?您是否真的将NULL
用于未知值? NULL
的SQL语义是完全合乎逻辑的,如果你认为它是一个未知值,但它在所有其他情况下不必要地使所有内容复杂化。基本上,在SQL中引入NULL
可能是一个错误,因为它在1天内引起的问题不仅仅是它在关系理论的历史中解决的问题,直到现在。