【问题标题】:How to remove an extra char which is coming in XMLAGG() output如何删除 XMLAGG() 输出中的额外字符
【发布时间】:2015-01-16 15:45:24
【问题描述】:

我正在使用 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

我们将 LISTAGG() 替换为 XMLAGG() 以避免连接错误。 当我检查两个函数输出的字符长度时,XMLAGG() 给出了一个额外的字符长度。 您能否建议我如何克服这个问题。

请找到下面的sql并输出

XMLAGG():

SELECT TO_CHAR (
      SUBSTR (
         XMLAGG (XMLELEMENT (e, table_name, CHR (13)).EXTRACT (
                    '//text()') ORDER BY tablespace_name).GetClobVal (),
         1,
         2000))
      AS str_concate,
   LENGTH (
      TO_CHAR (
         SUBSTR (
            XMLAGG (XMLELEMENT (e, table_name, CHR (13)).EXTRACT (
                       '//text()') ORDER BY tablespace_name).GetClobVal (),
            1,
            2000)))
      AS str_length
FROM all_tables
WHERE table_name = 'TEST_LOAD

输出:

STR_CONCATE                  STR_LENGTH

TEST_LOAD  TEST_LOAD              26

LISTAGG()

SELECT LISTAGG (SUBSTR (table_name, 1, 2000), CHR (13))
      WITHIN GROUP (ORDER BY tablespace_name)
      AS str_concate,
   LENGTH (
      LISTAGG (SUBSTR (table_name, 1, 2000), CHR (13))
         WITHIN GROUP (ORDER BY tablespace_name))
      AS str_length
FROM all_tables
WHERE table_name = 'TEST_LOAD';

输出:

STR_CONCATE                  STR_LENGTH

TEST_LOAD TEST_LOAD               25

【问题讨论】:

  • 用其他字符替换 CHR(13) 并运行查询。您会看到在 XMLAGG 中,该字符被附加在末尾,而在 LISTAGG 中则没有。
  • 我在 LISTAGG() 中也有相同的 CHR(13),但它没有给出任何问题
  • 我想@Eat Å Peach 建议将 chr(13) 替换为另一个(可见)字符,以向您展示 XMLAGG 在每个 table_name 之后添加此分隔符(甚至在最后一个之后)
  • 是的,我删除了 CHR(13) 并检查了 ',' 然后我使用 rtrim(...., ',') 删除了最后一个。与 chr(13) 相同的是:(

标签: oracle11g


【解决方案1】:
  • XMLELEMENT 的情况下,您实际上创建了具有两个子节点的XML 树节点:table_nameCHR(13)。 (可能它最终看起来像单个节点,因为两者都是文本,但它并不重要。)它是expansion of value_expr nonterminal。重要的是节点不知道其他节点,CHR(13) 被添加到每个节点作为其后缀,或者换句话说,终止符

  • LISTAGG 的情况下,您描述了多个元素的聚合。在这种情况下,您的 CHR(13) 充当位于元素之间的 delimiter (see syntax diagram)。它是分隔符而不是终结符。

由于XMLAGG 不会受到4000 char limit 的影响,我通常更喜欢XMLAGG。 如果需要分隔符,我建议在每个值之前添加它,并使用substr 减少第一次出现。追加 after 是可能的,但会使表达更加困难。

substr(
  xmlagg(
    xmlelement(e, ', ' || table_name).extract('//text()')
    order by tablespace_name
  ).getclobval(),
  3   -- length(', ')+1
)

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2015-03-12
    • 2017-08-15
    • 1970-01-01
    • 2015-08-06
    • 2018-08-22
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多