【问题标题】:SQL - Divide single column in multiple columnsSQL - 将单列分成多列
【发布时间】:2014-07-24 20:40:21
【问题描述】:

我有以下 SQL 问题:

如何使用 SELECT 命令将一列(里面的文本)分割成两个单独的列?

我需要使用空格字符分隔文本数据。 我知道最好举一个例子来简化它。所以:

SELECT COLUMN_A FROM TABLE1

输出:

COLUMN_A
-----------
LORE IPSUM

想要的输出:

COLUMN_A   COLUMN_B
---------  ----------
LORE       IPSUM

感谢大家的帮助。

【问题讨论】:

    标签: sql oracle select split


    【解决方案1】:

    取决于数据的一致性 - 假设一个空格是您希望在第一列和第二列中显示的内容之间的分隔符:

    WITH TEST_DATA AS
      (SELECT 'LOREM IPSUM' COLUMN_A FROM DUAL)
    
    SELECT SUBSTR(t.COLUMN_A, 1, INSTR(t.COLUMN_A, ' ')-1) AS COLUMN_A,
           SUBSTR(t.COLUMN_A, INSTR(t.COLUMN_A, ' ')+1) AS COLUMN_B
    FROM test_data T;
    

    您还可以将以下查询与 REGEX 一起使用:

    WITH TEST_DATA AS
       (SELECT 'LOREM IPSUM' COLUMN_A FROM DUAL)
    
    SELECT REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 1, 1) COLUMN_A,
           REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 1, 2) COLUMN_B
    FROM test_data T;
    

    Oracle 10g+ 支持正则表达式,根据您需要解决的情况提供更大的灵活性。它还有一个正则表达式子字符串方法...

    编辑: 3 字拆分:

    WITH TEST_DATA AS
      (SELECT 'LOREM IPSUM DIMSUM' COLUMN_A FROM DUAL)
    
     SELECT REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 1, 1) COLUMN_A,
         REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 1, 2) COLUMN_B,
         REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 2, 3) COLUMN_C
     FROM test_data T;
    

    参考:

    【讨论】:

    • 您好@Nisha,感谢您的回答!我没想到要使用 SUBSTR/INSTR 来管理它,所以谢谢!还有一个问题:如果我有 3 个单词要拆分?我们该怎么做?
    • 将此查询用于 3 个单词的拆分。参考编辑
    • 非常感谢Nisha,请问你--'[^ ]+', 1, 1 -- 中的第一个数字是为了什么?我的意思是你放 1,1 而不是 2。为什么这些?
    • 这个链接可能会有所帮助oracle-base.com/articles/misc/…>
    【解决方案2】:

    该解决方案可以使用计数器和PIVOT 运算符进行概括,计数器获取字号,PIVOT 将行更改为列

    WITH Counter (N) AS (
      SELECT LEVEL FROM DUAL
      CONNECT BY LEVEL <= (SELECT MAX(regexp_count( COLUMN_A, ' ')) + 1
                           FROM   Table1)
    )
    SELECT Word_1, Word_2, Word_3, Word_4
    FROM   (SELECT t.COLUMN_A
                 , c.N N
                 , REGEXP_SUBSTR(t.COLUMN_A, '[^ ]+', 1, c.N) Word
            FROM   Table1 t
                   LEFT JOIN Counter c ON c.N <= regexp_count( COLUMN_A, ' ') + 1) b
           PIVOT
           (MAX(Word) FOR N IN (1 Word_1, 2 Word_2, 3 Word_3, 4 Word_4)) pvt
    

    SQLFiddle demo

    但是在PIVOT 定义中有一个固定的列列表,要真正进行一般查询,需要动态枢轴或PIVOT XML

    【讨论】:

      【解决方案3】:
      INSERT INTO Rough (Tag_Id,Status_ , new_)                      
              WITH TEST_DATA AS              
                   (SELECT regexp_replace('&data' ,'\s+',' ') COLUMN_A FROM DUAL)
                       SELECT REGEXP_SUBSTR (REGEXP_SUBSTR (t.COLUMN_A, '[^-]+', 1, LEVEL), '[^ ]+', 1, 1) AS Col1,
                             REGEXP_SUBSTR (REGEXP_SUBSTR (t.COLUMN_A, '[^-]+', 1, LEVEL), '[^ ]+', 1, 2) AS Col2,
                                  REGEXP_SUBSTR (REGEXP_SUBSTR (t.COLUMN_A, '[^-]+', 1, LEVEL), '[^ ]+', 1, 3) AS Col3
                                      FROM test_data T    
                                           CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (t.COLUMN_A, '[^-]+')) + 1;
      

      【讨论】:

      • 你能edit你的答案解释你改变了什么以及为什么这会解决这个问题吗?
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2019-01-17
      • 2020-03-08
      相关资源
      最近更新 更多