我在使用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()
,但没有成功。
答案 0 :(得分:1)
您可以在下面尝试
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)
答案 2 :(得分:0)
我对可能的数据类型问题的预感是正确的。
函数xmltable
返回类型为XMLTYPE
的列,在我的情况下为列 B 。每当尝试聚合该数据类型的字段时,聚合函数都会失败。
我通过将XMLTYPE
列转换为字符串来解决此问题,从而解决了该问题:
SELECT A,
trim((COLUMN_VALUE).getstringval()) B
FROM one,
xmltable(('"'
|| REPLACE(B, ':', '","')
|| '"'))
使用此查询返回的结果是正确的。
非常感谢所有尝试提供帮助的人。