SQL - 在多列中划分单列

时间:2014-06-04 09:10:32

标签: sql oracle select split

我有以下SQL问题:

如何使用SELECT命令将列(文本内部)划分为两个具有拆分文本的单独列?

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

SELECT COLUMN_A FROM TABLE1

输出:

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

期望的输出:

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

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:5)

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

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;

参考:

答案 1 :(得分:1)

可以使用计数器和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的常规查询