在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然后bNULL表示为宽度为零的子字符串。

db 提琴here

,

那很简单:

  1. 不要汇总您不想获取的行。为此,您只需要为所需的行生成xmlelement,并为其他行返回null。
  2. 只需将要从结果中修剪的所有字符放到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