【问题标题】:Concatenating All Columns of Each Record Into One Entry将每条记录的所有列连接到一个条目中
【发布时间】:2016-12-15 21:22:39
【问题描述】:

我正在尝试将表的记录提取到 csv 文件中。 SQL查询很简单

SELECT * FROM MY_TABLE_NAME

给出一个假设的记录集

A B C D
E F G H
I J K L

我想要的是一个记录集,其中所有列都连接在一起,例如

A, B, C, D
E, F, G, H
I, J, K, L

我接触过 LISTAGG,但我不想汇总记录。我想维护每个单独的行条目的结构,只是用分隔符分隔。有什么想法吗?

编辑:

我需要将查询应用于我不知道列数是多少的多个表。此外,表结构会定期更改,我需要它足够灵活来解决这个问题。

【问题讨论】:

    标签: sql oracle concatenation


    【解决方案1】:

    在这方面做了很多工作之后,我想出了一个答案。非常感谢在这个不同但相关的线程中提供的帮助:How to Refer to a Column by ID or Index Number

    底线:我使用动态 SQL 创建了一个查询,然后使用 EXECUTE IMMEDIATE 运行它。结果被一一循环输出。这是一个更优雅的解决方案。

    DECLARE
        j    number := 0;
        sql_query    varchar2(32000);
        l_tableheaders    varchar2(32000);
        TYPE array_type IS TABLE OF varchar2(200) NOT NULL index by binary_integer;
        Data_Array array_type;
        MyTableName := 'TableName';
    
    BEGIN
        SELECT LISTAGG(column_name, ' || '','' || ') WITHIN GROUP (ORDER BY column_id)
            INTO l_tableheaders FROM all_tab_cols WHERE table_name = MyTableName;
    
        sql_query := ' SELECT ' || l_tableheaders || ' FROM ' || MyTableName;
    
        EXECUTE IMMEDIATE sql_query BULK COLLECT INTO Data_Array;
    
        FOR j in 1..Data_Array.Count
        LOOP
            DBMS_OUTPUT.PUT ( Data_Array(j) );
            DBMS_OUTPUT.NEW_LINE;
        END LOOP;
    
    END;
    

    【讨论】:

      【解决方案2】:

      只需使用连接运算符:

      select col1 || ', ' || col2 || ', ' || col3 || ', ' || col4
      from t;
      

      【讨论】:

      • 这在这种情况下不起作用,因为我不知道存在多少列。我需要将查询应用于结构可能会定期更改的多个表。
      • 在事先不知道列数和列名的情况下,有没有办法动态的呢?
      • @SandPiper 。 . .您必须使用动态 SQL。
      • @GordonLinoff 如果该字符串超过 4000 个字符怎么办?我收到连接字符串太长的错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 2013-07-23
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2016-02-06
      相关资源
      最近更新 更多