Presto 查询根据特定列中的值排除行

Presto query to exclude rows based on the value in a specific column

这看起来应该很简单,但我想我遗漏了什么。

我有一个查询,我正在从我的数据库中选择一堆列,并且我想排除(例如)省份 = 'ontario' 或 'quebec' 的任何行.我已经尝试了很多方法,但结果不同 - none 其中是我想要的。

select .... from fulldata 
   WHERE substr(code, 1, 5) <> '10000' 
   AND (province <> 'ontario' OR province <> 'quebec')

这确实可以排除省是这些值之一的行,但它也排除省是 null/blank 的所有行 - 不知道为什么。

我试过 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')

这行得通,但似乎不像 "right" 的方式。知道发生了什么事吗?

我在 Athena 上使用 Presto。

provinceNULL(认为:"unknown")时:

(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'))