Presto查询以基于特定列中的值排除行

这似乎应该很简单,但是我想我缺少了一些东西。

我有一个查询,要从数据库中选择一堆列,并且要排除省(例如)省份=“安大略省”或“魁北克省”的任何行。我已经尝试了很多方法,但结果却不同-我都没有想要的结果。

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。

duolaimix 回答:Presto查询以基于特定列中的值排除行

provinceNULL(认为:“未知”)时,则:

(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'))
本文链接:https://www.f2er.com/3136455.html

大家都在问