SQL 中的 LISTAGG 返回具有空值的行

Posted

技术标签:

【中文标题】SQL 中的 LISTAGG 返回具有空值的行【英文标题】:LISTAGG in SQL is returning a row with null values 【发布时间】:2021-05-27 12:13:05 【问题描述】:

我有 2 个表 A 和 B,B 与 A 有外键关系,即 (b.detail_id = a.id) 我想对 B 中的一列应用 LISTAGG 查询。

SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) 
delivery_cadence, a.id FROM A a, B b WHERE b.detail_id = a.id AND a.id = 1236565;

上面的查询返回给我一个所有值都为空的行,但我不想要任何行。我怎样才能做到这一点? 如果不可能有任何替代解决方案。

A表中不存在a.id = 1236565。

【问题讨论】:

a.detail_id = a.id ? 抱歉,我的错误b.detail_id = a.id 已编辑 使用显式连接而不是隐式连接,这意味着使用join ... on并停止使用,来连接表。 【参考方案1】:

只需添加having count(b.delivery_cadence) > 0 例如

SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) 
delivery_cadence, a.id FROM A a, B b WHERE b.detail_id = a.id AND a.id = 1236565
HAVING COUNT(b.delivery_cadence) > 0

【讨论】:

应该有count(b.delivery_cadence) > 0 来排除带有all空值的ID【参考方案2】:

假设您有这样的表格:

create table a(id) as
(
    select 1 from dual union all
    select 2 from dual
);
create table b(detail_id, delivery_cadence) as
(
    select 1, 'x' from dual union all
    select 1, 'A' from dual union all
    select 2, 'y' from dual
);

如果我理解得很好,你需要(在 ANSI 连接语法中):

SQL> SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) delivery_cadence,
  2          a.id
  3  FROM A
  4      inner join B ON b.detail_id = a.id
  5  where a.id = 1236565
  6  group by a.id;

no rows selected

对于表中存在的ID 值,您会得到:

SQL> SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) delivery_cadence,
  2          a.id
  3  FROM A
  4      inner join B ON b.detail_id = a.id
  5  where a.id = 1
  6  group by a.id;

DELIVERY_CADENCE         ID
---------------- ----------
A,x                       1

1 row selected.

【讨论】:

感谢正确的JOIN 语法。

以上是关于SQL 中的 LISTAGG 返回具有空值的行的主要内容,如果未能解决你的问题,请参考以下文章

返回 SQL 中返回空值的行?显示它们不是空白值

具有三个公共值的行中的空值,第四个随着一个匹配而变化

如何获取表中具有空值的行,并且没有任何关于任何列名的行?

PostgreSQL 查询列上具有最小空值的行

在 Hbase 中查找具有空值的行数

计算非空值的行