在 Oracle DB 中使用 LISTAGG 时,如何从字符串中删除 CHR(0)?



我正在尝试查询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 

相关内容

  • 没有找到相关文章

最新更新