簡體   English   中英

在 sql 查詢中連接 clob cloumn 值

[英]Concatenating clob cloumn values in sql query

我在我的 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

如果您詢問尾隨逗號,那么您將使用逗號和空格進行連接,因此尾隨字符是空格而不是逗號。

如果您詢問相鄰的分隔符之間沒有值,那么當您的CASE語句的WHEN UNIQ_ID IN ( ... )部分不匹配時,您將獲得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;

輸出:

\n |  COMBINED_VAL |\n |  :----------- |\n |  a, , b, |\n

尾隨逗號空間沒有被修剪,因為最后一個字符是一個空格,值是a然后NULL然后b並且NULL表示為零寬度子字符串。

db<> 在這里擺弄

這很簡單:

  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,
                        TABLE1.COL_NAME||', '
                        )
           END
           ORDER BY TABLE1.UNIQ_ID
         ).extract('//text()').GETCLOBVAL(),
         ', '
       ) COMBINED_VAL
from TABLE1;

結果:

COMBINED_VAL
----------------------------------------
2, 4, 6, 8, 10, 12, 14, 16, 18, 20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM