【问题标题】:How to flatten nested tables into a new row?如何将嵌套表展平为新行?
【发布时间】:2019-01-09 12:58:04
【问题描述】:

我有一个表,其中一列包含一个单行嵌套表。

mytable 
title | col
a     | {1, 2}
b     | {3}
c     | NULL

我需要做的是将嵌套表展平为逗号分隔的字符串。

Result:
{
    a: "1, 2"
    b: "3"
    c: NULL
}  

出于我的特定目的,我不能只将结果以表格形式(上面非常简化,但它会解决我的问题)。我认为我得到的最接近的是以下语句(仅返回 1、2、3、null)。

select t.* 
from mytable, table(mytable.col)(+) t;

我已经尝试过listagg,但无法让它适用于我的情况。我目前正在尝试阅读更多嵌套表,但进展缓慢,而且我无法找到任何针对此特定问题(嵌套表)的内容。

【问题讨论】:

    标签: sql oracle nested-table


    【解决方案1】:

    这能满足您的需要吗?你是什​​么意思 listagg 没有为你的目的工作?

    CREATE OR REPLACE TYPE my_tab_t AS TABLE OF VARCHAR2(30);
    /
    CREATE TABLE nested_table (id NUMBER, col1 my_tab_t)
           NESTED TABLE col1 STORE AS col1_tab;
    
    INSERT INTO nested_table VALUES (1, my_tab_t('A'));
    INSERT INTO nested_table VALUES (2, my_tab_t('B', 'C'));
    INSERT INTO nested_table VALUES (3, my_tab_t('D', 'E', 'F'));
    
     SELECT TMP.id,
            listagg(Column_Value,',') 
              WITHIN GROUP(ORDER BY Column_Value)
       FROM (SELECT id, 
                    COLUMN_VALUE 
               FROM nested_table t1, 
                    TABLE(t1.col1) t2
            ) TMP
      GROUP
         BY id
    

    http://sqlfiddle.com/#!4/90cfb6

    【讨论】:

    • 这正是我所需要的,谢谢。我说我无法让 listagg 工作的意思是我无法正确使用语法。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2020-10-18
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多