过滤掉特定值而不排除 NULL 行

Posted

技术标签:

【中文标题】过滤掉特定值而不排除 NULL 行【英文标题】:Filter out specific value without excluding the NULL rows 【发布时间】:2021-03-03 14:25:05 【问题描述】:

我有下表,我想过滤掉一个特定的值,但保留空(空)行。

category       sell
Apple           1
Orange          3
Banana          2
null            1
Orange          2
null            1

我尝试了不同的方法,但查询一直过滤掉 null 行。比如我只想过滤掉橙色的行,输出表应该是:

category       sell
Apple           1
Banana          2
null            1
null            1

SELECT *
FROM table AS t 
WHERE t."sell"  NOT IN ('Orange') 

我也试过

WHERE t."sell"  != 'Orange'

WHERE t."sell"  NOT LIKE '%Orange%'

所有返回的结果都排除了具有空值的行。任何建议将不胜感激。

【问题讨论】:

标记您的数据库,您使用的是哪个 dbms? @eshirvana 我正在使用 Redshift OR <column> IS NULL? @JeroenMostert 啊不,你是对的——它有效!谢谢! 【参考方案1】:

如果你有这个架构:

create table transaction(
  category varchar(15),
  sell int
)

insert into transaction(category, sell)
values('Apple',1), ('Orange',3), ('Banana',2), (null,1), ('Orange',2), (null,1)

你可以使用:

select *
from transaction
where category != 'Orange'
   or category is null

结果:

category    sell
Apple       1
Banana      2
null        1
null        1

【讨论】:

【参考方案2】:

您可以使用COALESCENVL

SELECT *
FROM table AS t 
WHERE COALESCE(t.category,'[notfruit]') NOT IN ('Orange') 

【讨论】:

感谢 gbeaven works 建议的上述方法,但我也会尝试您的方法!【参考方案3】:

Redshift 不支持显式 NULL-safe 相等运算符。但是您可以使用以下方法轻松模拟它:

where (fruit = 'Orange') is not true

is not true 处理 NULL 值符合大多数人的直觉——即不返回 NULL 但承认它们不是真的。

SQL 标准(以及现在的 Postgres)支持官方的此类比较:

where fruit is distinct from 'Orange'

但是,Redshift 不支持这种语法。

【讨论】:

以上是关于过滤掉特定值而不排除 NULL 行的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据框中排除特定的行?

在 servlet 过滤器中排除特定 URL

Android Gradle - 仅针对特定任务过滤掉变体

从特定操作中排除过滤器

排除 IntelliJ / LogCat 中的某些 Log.i 消息?

我可以以某种方式从java中的Collections.Min / Collections.Max中排除或过滤掉一个值吗?