我正在尝试查询oracle数据库并在结果的单个单元格中获取名称列表。
我有一个如下所示的查询,它在单独的行中生成名称:
SELECT (lastname || ', ' || firstname) as fullname
FROM users
WHERE {some condition}
-- result --
fullname
Anderson, Alex
Baker, Bob
Clark, Carl
但是,当我尝试使用 LISTAGG 连接这些行时,出现以下错误:
SELECT LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname) as instructors
FROM
(
SELECT (lastname || ', ' || firstname) as fullname
FROM users
WHERE {some condition}
)
-- desired result --
instructors
Anderson, Alex; Baker, Bob; Clark, Carl
-- actual result --
Error Type: System.Xml.XmlException
Error Message: hexadecimal value 0x00, is an invalid character. Line 1, position 32.
请注意,如果我对由连接 INT 值组成的字符串使用 LISTAGG,则查询将按预期工作:
SELECT LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname) as instructors
FROM
(
SELECT (pk1 || ', ' || pk1) as fullname -- pk1 is the users primary key
FROM users
WHERE {some condition}
)
-- result --
instructors
01, 01; 02, 02; 03, 03
我怀疑问题是名字和姓氏字段以空结尾,并且 LISTAGG 没有正确从结果中删除空字符。不过,我不确定如何从内部查询的结果中删除空字符。
请注意,这是客户端的数据库,我不允许修改其内容。我需要能够以当前格式读取字段并生成所需的输出。
我遇到了同样的问题。我的解决方案是:
SELECT replace(LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname), chr(0)) as instructors