XMLTABLE返回空结果集后的聚合函数

时间:2018-11-23 11:26:56

标签: sql oracle

我在使用LISTAGG()函数的查询中遇到麻烦。

我以这种形式从表一个开始:

A   B
1  a:b:e
2  c:d:f

然后我将其转换为表格两个的这种形式:

A  B
1  a
1  b
1  e
2  c
2  d
2  f

使用此查询:

SELECT A,
  trim(COLUMN_VALUE) B
FROM one,
  xmltable(('"'
  || REPLACE(B, ':', '","')
  || '"'))

然后我执行

SELECT A,
  LISTAGG(B, ', ') WITHIN GROUP (ORDER BY B)
FROM two
GROUP BY A

再次返回表格:

A    B
1  a,b,e
2  c,d,f

问题在于,查询最终返回一个空结果集:

A    B

而不是我所期望的。 不幸的是,我无法使用更简单的查询来重现我的问题,并且因为包含敏感信息,所以我无法共享原始查询。

我希望这可能是一个已知问题,或者可能与字段数据类型有关。我试图在TO_CHAR(B)函数内添加LISTAGG(),但没有成功。

3 个答案:

答案 0 :(得分:1)

您可以在下面尝试

DEMO

SELECT A,
  LISTAGG(B, ', ') WITHIN GROUP (ORDER BY B)
FROM 
(SELECT A,
  trim(COLUMN_VALUE) B
FROM one,
  xmltable(('"'
  || REPLACE(B, ':', '","')
  || '"'))
) two GROUP BY A

输出:

A   B
1   a, b, e
2   c, d, f

答案 1 :(得分:1)

这将起作用:

select a.*,REPLACE(a.B, ':', ',') from NS a;

sql小提琴:http://sqlfiddle.com/#!9/2c1e9d/2/0

答案 2 :(得分:0)

我对可能的数据类型问题的预感是正确的。

函数xmltable返回类型为XMLTYPE的列,在我的情况下为列 B 。每当尝试聚合该数据类型的字段时,聚合函数都会失败。

我通过将XMLTYPE列转换为字符串来解决此问题,从而解决了该问题:

SELECT A,
  trim((COLUMN_VALUE).getstringval()) B
FROM one,
  xmltable(('"'
  || REPLACE(B, ':', '","')
  || '"'))

使用此查询返回的结果是正确的。

非常感谢所有尝试提供帮助的人。