【发布时间】:2018-10-20 03:14:25
【问题描述】:
我正在尝试查询 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
我怀疑问题在于 firstname 和 lastname 字段以 null 结尾,并且 LISTAGG 没有正确地从结果中删除 null 字符。不过,我不确定如何从内部查询的结果中删除空字符。
请注意,这是客户的数据库,我不能修改其内容。我需要能够以当前格式读取字段并生成所需的输出。
【问题讨论】:
-
您的设置与 XML 有什么关系?您显示的不是 Oracle 错误,而是“system.xml”错误 - 这是什么意思?
-
你是如何执行这个查询的?通过使用 XML 的基于 Web 的前端?或许可以尝试不使用 XML 中用于终止实体的分号。另请注意,整数不能包含诸如
&<或>之类的字符,这也会让 xml 感到厌烦。 -
@Used_By_already 查询正在通过自定义 .net windows 窗体应用程序执行。该表单接受一个文本输入字段并将其作为 SQL 查询传递给数据库,然后将结果放入第二个文本框中。我无权访问此应用程序的源代码。有一个单独的基于 Web 的界面也可以查询数据库我会看看我是否可以得到它来尝试我的自定义查询。
-
正是@mathguy 提出的观点:报告的错误不是Oracle 提出的,它在返回查询结果后出现了问题。在字符串中找到的东西,但不是整数。正如我之前建议的那样,可能是 & 或撇号、引号。
-
@Used_By_Already 还有你的第二点:分号在第三个实例中很好,我得到了结果“01, 01; 02, 02; 03, 03”。只是为了确保我尝试了使用“:”而不是“;”的实际名称并没有什么区别。