Oracle 11g:LISTAGG忽略NULL值

WBA*_*BAR 5 sql plsql oracle11g

我有一些TABLE1数据表:

+------------+
|    COL1    |
+------------+
|   FOO      |
|   BAR      |
|  (null)    |
|   EXP      |
+------------+
Run Code Online (Sandbox Code Playgroud)

FIDDLE

当我执行时:

SELECT listagg(col1, '#') within group(ORDER BY rownum) 
  FROM table1
Run Code Online (Sandbox Code Playgroud)

我收到:FOO#BAR#EXP但我想拥有:FOO#BAR##EXP

LISTAGG忽略空单元格:/)

有没有实现自己的功能的想法吗?

Din*_*del 5

select replace(listagg(NVL(col1, '#'), '#') 
within group(order by rownum),'###','##') from table1
Run Code Online (Sandbox Code Playgroud)

您可以在NVL(col1, '#') 此处使用,您可以传递任何值而不是null。

HErE是演示

  • 当两个连续的列为 NULL 时,这不起作用,因为 REPLACE 只会替换第一次出现并且无法匹配下一个。这有什么提示吗? (2认同)

小智 5

select substr(listagg('#'||col1) within group (order by rownum),2)
from table1
Run Code Online (Sandbox Code Playgroud)

在每个值之前添加分隔符(这只会为 NULL 生成分隔符),然后在没有分隔符的情况下进行聚合,并去除前导分隔符。