过滤掉特定值而不排除 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 我正在使用 RedshiftOR <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】:您可以使用COALESCE
或NVL
:
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 行的主要内容,如果未能解决你的问题,请参考以下文章
排除 IntelliJ / LogCat 中的某些 Log.i 消息?
我可以以某种方式从java中的Collections.Min / Collections.Max中排除或过滤掉一个值吗?