【问题标题】:SQL | SPLIT COLUMNS INTO ROWSSQL |将列拆分为行
【发布时间】:2021-12-10 19:19:50
【问题描述】:

如何使用基本 SQL 将列数据拆分为行。

COL1 COL2
1     A-B
2     C-D
3     AAA-BB

结果

COL1 Col2
1     A
1     B
2     C
2     D
3     AAA
3     BB

【问题讨论】:

  • 您使用的是 MySQL 还是 Oracle? (答案不适合两者……)
  • 总是第一个和第三个字符吗? (或者可以是 ABC-DD?)
  • ORACLE SQL,它可以是 ABC-DD
  • 还是简单地用- 来表示分割,你可以有 A-B-C-D 并且需要 4 行?
  • 这是一个相当不完整的问题,需要更多上下文。您使用的是哪个版本的 SQL?微软 SQL? MySql 还是 Oracle? @Neel 请编辑问题和标签以更符合您的要求

标签: oracle snowflake-cloud-data-platform


【解决方案1】:

从 Oracle 12 开始,如果它始终是两个分隔值,那么您可以使用:

SELECT t.col1,
       l.col2
FROM   table_name t
       CROSS JOIN LATERAL (
         SELECT SUBSTR(col2, 1, INSTR(col2, '-') - 1) AS col2 FROM DUAL
         UNION ALL
         SELECT SUBSTR(col2, INSTR(col2, '-') + 1) FROM DUAL
       ) l

其中,对于样本数据:

CREATE TABLE table_name (COL1, COL2) AS
SELECT 1, 'A-B' FROM DUAL UNION ALL
SELECT 2, 'C-D' FROM DUAL UNION ALL
SELECT 3, 'AAA-BB' FROM DUAL;

输出:

COL1 COL2
1 A
1 B
2 C
2 D
3 AAA
3 BB

db小提琴here

【讨论】:

    【解决方案2】:

    Snowflake 被标记,所以这里是雪花的方式:

    WITH TEST (col1, col2) as
          (select 1, 'A-B' from dual union all
           select 2, 'C-D' from dual union all
           select 3, 'AAA-BB' from dual
          )
    SELECT test.col1, table1.value 
    FROM test, LATERAL strtok_split_to_table(test.col2, '-') as table1
    ORDER BY test.col1, table1.value;
    

    【讨论】:

      【解决方案3】:

      从甲骨文开始:

      SQL> with test (col1, col2) as
        2    (select 1, 'A-B' from dual union all
        3     select 2, 'C-D' from dual union all
        4     select 3, 'AAA-BB' from dual
        5    )
        6  select col1,
        7    regexp_substr(col2, '[^-]+', 1, column_value) col2
        8  from test cross join
        9    table(cast(multiset(select level from dual
       10                        connect by level <= regexp_count(col2, '-') + 1
       11                       ) as sys.odcinumberlist))
       12  order by col1, col2;
      
            COL1 COL2
      ---------- ------------------------
               1 A
               1 B
               2 C
               2 D
               3 AAA
               3 BB
      
      6 rows selected.
      
      SQL>
      

      【讨论】:

        【解决方案4】:

        对于 MS-SQL 2016 及更高版本,您可以使用:

        SELECT Col1, x.value
        FROM t CROSS APPLY STRING_SPLIT(t.Col2, '-') as x;
        

        顺便说一句:如果 Col2 包含 null,它不会出现在结果中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          • 2012-05-20
          相关资源
          最近更新 更多