将varchar拆分为Oracle中的单独列

时间:2011-03-04 22:09:05

标签: sql oracle

我有点挑剔:我被要求从数据库中的特定字符串开始收集注释,并将结果分成不同的列。

例如 - 如果返回的值是:

COLUMN_ONE
--------------------
'D7ERROR username'

回报必须是:

COL_ONE    COL_TWO
--------------------
D7ERROR   username   

一旦结构集的结构只是为了将字符串拆分为两个,是否可以定义列?

3 个答案:

答案 0 :(得分:42)

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

SELECT SUBSTR(t.column_one, 1, INSTR(t.column_one, ' ')-1) AS col_one,
       SUBSTR(t.column_one, INSTR(t.column_one, ' ')+1) AS col_two
  FROM YOUR_TABLE t

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

参考:

答案 1 :(得分:33)

使用REGEXP_SUBSTR就像:

一样简单
SELECT REGEXP_SUBSTR(t.column_one, '[^ ]+', 1, 1) col_one,
       REGEXP_SUBSTR(t.column_one, '[^ ]+', 1, 2) col_two
FROM YOUR_TABLE t;

答案 2 :(得分:3)

简单的方法是转换为列

SELECT COLUMN_VALUE FROM TABLE (SPLIT ('19869,19572,19223,18898,10155,'))

CREATE TYPE split_tbl as TABLE OF VARCHAR2(32767);

CREATE OR REPLACE FUNCTION split (p_list VARCHAR2, p_del VARCHAR2 := ',')
   RETURN split_tbl
   PIPELINED IS
   l_idx PLS_INTEGER;
   l_list VARCHAR2 (32767) := p_list;
   l_value VARCHAR2 (32767);
BEGIN
   LOOP
      l_idx := INSTR (l_list, p_del);

      IF l_idx > 0 THEN
         PIPE ROW (SUBSTR (l_list, 1, l_idx - 1));
         l_list := SUBSTR (l_list, l_idx + LENGTH (p_del));
      ELSE
         PIPE ROW (l_list);
         EXIT;
      END IF;
   END LOOP;

   RETURN;
END split;