如何解决在SQL查询中串联Clob Cloumn值
我在sql查询中使用此语句来连接较大的clob列值,但输出中包含多余的“,”(逗号),无法弄清楚出了什么问题。
SELECT RTRIM(
XMLAGG(
XMLELEMENT(
E,CASE WHEN UNIQ_ID IN ( SELECT VAL
FROM SOME_TABLE
WHERE VAL_NM = 'SOME_TEXT' )
THEN TABLE1.COL_NAME
ELSE NULL
END,','
).EXTRACT('//text()')
ORDER BY TABLE1.UNIQ_ID
).GETCLOBVAL(),'
) COMBINED_VAL
解决方法
如果您要询问结尾的逗号,那么您是在使用逗号然后是空格进行级联,因此结尾字符是一个空格而不是逗号。
如果您询问相邻的分隔符之间没有值,那么当WHEN UNIQ_ID IN ( ... )
语句的CASE
部分不匹配时,您将得到一个NULL
值;将其连接到汇总输出中,然后您将发现有两个相邻的逗号分隔符,中间没有文本。
例如:
WITH test_data ( id,value ) AS (
SELECT 1,'a' FROM DUAL UNION ALL
SELECT 2,NULL FROM DUAL UNION ALL
SELECT 3,'b' FROM DUAL
)
SELECT RTRIM(
XMLAGG(
XMLELEMENT(
E,value,','
).EXTRACT('//text()')
ORDER BY id
).GETCLOBVAL(),'
) AS COMBINED_VAL
FROM test_data;
输出:
| COMBINED_VAL | | :----------- | | a,b,|
末尾的逗号不被修剪,因为最后一个字符是一个空格,值依次为a
然后NULL
然后b
和NULL
表示为宽度为零的子字符串。
db 提琴here
,那很简单:
- 不要汇总您不想获取的行。为此,您只需要为所需的行生成xmlelement,并为其他行返回null。
- 只需将要从结果中修剪的所有字符放到rtrim的第二个参数中即可:
SELECT RTRIM(
XMLAGG(
CASE WHEN UNIQ_ID IN ( SELECT VAL
FROM SOME_TABLE
WHERE VAL_NM = 'SOME_TEXT' )
and COL_NAME is not null
THEN XMLELEMENT(
E,TABLE1.COL_NAME||','
)
END
ORDER BY TABLE1.UNIQ_ID
).extract('//text()').GETCLOBVAL(),'
) COMBINED_VAL
from table1;
带有示例数据和结果的完整测试用例:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=452c715247e8edda8735014ff2fb34f4
with
SOME_TABLE(VAL,VAL_NM) as (
select level*2,'SOME_TEXT' from dual connect by level<=10
),TABLE1(UNIQ_ID,COL_NAME) as (
select level UNIQ_ID,to_clob(level) COL_NAME
from dual
connect by level<=20
)
SELECT RTRIM(
XMLAGG(
CASE WHEN UNIQ_ID IN ( SELECT VAL
FROM SOME_TABLE
WHERE VAL_NM = 'SOME_TEXT' )
and COL_NAME is not null
THEN XMLELEMENT(
E,'
) COMBINED_VAL
from TABLE1;
结果:
COMBINED_VAL
----------------------------------------
2,4,6,8,10,12,14,16,18,20
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。