DB2选择不等于NULL的字符串

时间:2016-04-08 13:56:03

标签: sql db2

我在COLUMN1 CHAR(1)中有MYTABLE,其中所有行都是NULL,这是我的SQL查询:

SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A'

它不会返回任何内容,因为NULL中的所有行都有COLUMN1。我想它应该归还一切。我如何使其工作?我不想使用

COALESCE(NULLIF(COLUMN1, ''), '*')

因为它会降低查询速度。还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

如果你真的想要NULL,那么为什么不呢

SELECT COLUMN1 FROM MYTABLE WHERE (COLUMN1 != 'A' OR COLUMN1 IS NULL)

???

答案 1 :(得分:2)

你的假设是错误的。基本上所有NULL的比较运算符都返回" false"或NULL(已在WHERE子句中过滤掉),IS NULLIS 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 NULLIS NOT NULL这两个旨在与NULL配合使用的特殊运算符。所以你可以这样做:

SELECT COLUMN1 FROM MYTABLE WHERE COLUMN1 != 'A' OR COLUMN1 IS NULL

但首先要问问自己:这是你想要的吗?您是否真的将NULL用于未知值? NULL的SQL语义是完全合乎逻辑的,如果你认为它是一个未知值,但它在所有其他情况下不必要地使所有内容复杂化。基本上,在SQL中引入NULL可能是一个错误,因为它在1天内引起的问题不仅仅是它在关系理论的历史中解决的问题,直到现在。