这似乎应该很简单,但是我想我缺少了一些东西。
我有一个查询,要从数据库中选择一堆列,并且要排除省(例如)省份=“安大略省”或“魁北克省”的任何行。我已经尝试了很多方法,但结果却不同-我都没有想要的结果。
select .... from fulldata
WHERE substr(code, 1, 5) <> '10000'
AND (province <> 'ontario' OR province <> 'quebec')
这确实可以排除省份为那些值之一的行,但也可以排除省份为空/空白的所有行-不知道为什么。
我尝试了AND NOT ( stateprovince = 'ontario' OR stateprovince = 'quebec')
,但结果相同。
我尝试了AND stateprovince <> ANY(VALUES 'ontario','quebec')
,它没有任何影响(显示所有数据,没有任何内容被过滤掉)
即使将其分解为AND stateprovince <> 'ontario'
之类的简单内容,也确实消除了安大略省的数据,但也摆脱了并非预期结果的空白。
在撰写本文时,我提出了一种解决方法,即将查询更改为:
...
AND (stateprovince IS NULL OR stateprovince <> 'ontario')
AND (stateprovince IS NULL OR stateprovince <> 'quebec')
这是可行的,但似乎不是“正确”的方法。知道怎么了吗?
我在雅典娜上使用Presto。
答案 0 :(得分:1)
当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'))