这看起来应该很简单,但我想我遗漏了一些东西。
我有一个查询,我从数据库中选择了一堆列,我想排除(例如(province="ontario"或"quebec"的任何行。我试过很多种方法,结果都不一样——都不是我想要的。
select .... from fulldata
WHERE substr(code, 1, 5) <> '10000'
AND (province <> 'ontario' OR province <> 'quebec')
这确实可以排除province是其中一个值的行,但它也排除了province为null/blank的所有行——不知道为什么。
我尝试了AND NOT ( stateprovince = 'ontario' OR stateprovince = 'quebec')
,得到了相同的结果。
我尝试了AND stateprovince <> ANY(VALUES 'ontario','quebec')
,它没有任何影响(所有数据都显示出来,没有任何内容被过滤掉(
即使将其分解为像AND stateprovince <> 'ontario'
这样简单的东西,也可以消除ontario数据,但也可以消除不是预期结果的空白。
在写这篇文章的过程中,我想出了一个变通方法,将查询更改为:
...
AND (stateprovince IS NULL OR stateprovince <> 'ontario')
AND (stateprovince IS NULL OR stateprovince <> 'quebec')
这是有效的,但似乎不是"正确"的方式。知道怎么了吗?
我在雅典娜身上使用普雷斯托。
当province
是NULL
时(想想:"未知"(,那么这个:
(province <> 'ontario' OR province <> 'quebec')
将计算为NULL
,过滤掉给定的行。由于NOT (NULL)
也是NULL
,因此没有简单的方法可以避免这种情况。因此,您需要一个明确的NULL
检查:
(province IS NULL OR province NOT IN('ontario', 'quebec'))
或者你可以这样写:
(coalesce(province, '') NOT IN('ontario', 'quebec'))