【问题标题】:Concatenating clob cloumn values in sql query在 sql 查询中连接 clob 列值
【发布时间】:2020-09-26 10:07:14
【问题描述】:

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

【问题讨论】:

    标签: sql oracle oracle10g string-concatenation clob


    【解决方案1】:

    如果您询问尾随逗号,那么您使用逗号连接空格,因此尾随字符是空格而不是逗号。

    如果您询问相邻分隔符之间没有值,那么当您的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;
    

    输出:

    |组合_VAL | | :----------- | |一个, , b, |

    尾随逗号空格不会被修剪,因为最后一个字符是空格,值是 a 然后 NULL 然后 b 并且 NULL 表示为零宽度子字符串。

    db小提琴here

    【讨论】:

    • 这是你提到的输出:-> (a, , b,)。我不想要结尾的逗号和空逗号。我的输出应该是(a,b)。非常感谢您能帮我解决这个问题。
    【解决方案2】:

    这很简单:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-17
      • 2012-12-28
      • 2011-04-16
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多