SQL有条件地选择非空行

Posted

技术标签:

【中文标题】SQL有条件地选择非空行【英文标题】:SQL Selecting non-null rows conditionally 【发布时间】:2016-03-17 21:12:59 【问题描述】:

我在 teradata 上有一张如下表。

每个客户在表中最多可以有 2 行 - 一行填充了地址,另一行地址为空。所以有些客户只能有一行有地址。有些只能有一行没有地址。有些可以有 2 行,一排有地址,一排没有地址。

我想要一个每个客户一行的输出表 - 如果有地址,那么我想要那行,如果没有,我想要空行。我尝试过使用 case 语句和 where 语句,但我似乎无法让它们工作。好像我需要像文本的 max 函数。

表 1

cust_id     address
1           abc
1   
2   
3           xyz

输出

cust_id      address
1            abc
2   
3            xyz

【问题讨论】:

【参考方案1】:

您可以将group by 子句与max 聚合函数一起使用:

select cust_id, max(address)
from tbl
group by cust_id

【讨论】:

谢谢,我刚刚更新了我的帖子说我认为我需要一个文本的最大功能。我没有意识到我可以在文本上使用 max 。会尝试确认。 如果这些是真正的空值,您甚至可以使用min()【参考方案2】:

group by 方法是最简单的表达方法。使用正确的索引,union all 可能会具有更好的性能:

select *
from tbl
where address is not null
union all
select *
from tbl t2
where address is null and
      not exists (select 1 from tbl t2 where t.cust_id = t2.cust_id and t2.address is not null);

注意:这具有为给定cust_id 保留所有非 NULL 值的优点/缺点。

【讨论】:

以上是关于SQL有条件地选择非空行的主要内容,如果未能解决你的问题,请参考以下文章

选择 PL/SQL 中两个非空列值之间的行集

在 Java 8 中懒惰地返回第一个非空列表

SQL多个条件查询语句

SQL将多行中的字段的空值填充为先前的非空值

SQL 怎么添加非空约束?

使用 codeigniter 中的 where 条件计算非空值