我有以下SQL问题:
如何使用SELECT命令将列(文本内部)划分为两个具有拆分文本的单独列?
我需要使用空格字符分隔文本数据。 我知道最好举个例子让它变得简单。所以:
SELECT COLUMN_A FROM TABLE1
输出:
COLUMN_A
-----------
LORE IPSUM
期望的输出:
COLUMN_A COLUMN_B
--------- ----------
LORE IPSUM
谢谢大家的帮助。
答案 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
但是在PIVOT
定义中有一个固定的列列表,要真正有一个动态数据透视或PIVOT XML
的常规查询