如何避免 Teradata 的 XMLCONCAT 和 XMLAGG 产生的额外空白

问题描述

使用 XMLAGGXMLCONCAT 时,teradata 似乎在串联内容之间添加了额外的空格:

with t (x) as (select 1)
select 
  xmlserialize(content xmlconcat(1,2,3) as varchar(1000)) a,xmlserialize(content xmlagg(v order by v) as varchar(1000)) b
from (
  select 1 from t
  union all
  select 2 from t
  union all
  select 3 from t
) as u (v)

以上产生:

|a    |b    |
|-----|-----|
|1 2 3|1 2 3|

有什么办法可以避免从 XML 连接中产生额外的空白工件并得到它?

|a  |b  |
|---|---|
|123|123|

解决方法

一个明显的技巧是在连接过程中引入一个“不可能”的字符序列,然后从结果中再次删除它:

with t (x) as (select 1)
select 
  oreplace(
    xmlserialize(content xmlconcat(1,'##',2,3) as varchar(1000)),' ## '
  ) a,oreplace(
    oreplace(
      xmlserialize(content xmlagg(trim(v || '##') order by v) as varchar(1000)),'## '
    ),'##'
  ) b
from (
  select 1 from t
  union all
  select 2 from t
  union all
  select 3 from t
) as u (v)

现在的结果是:

|a  |b  |
|---|---|
|123|123|