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。
当 province
为 NULL
(认为:"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'))
这看起来应该很简单,但我想我遗漏了什么。
我有一个查询,我正在从我的数据库中选择一堆列,并且我想排除(例如)省份 = '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。
当 province
为 NULL
(认为:"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'))