2011-03-04 89 views
16

我有点尴尬:我被要求从数据库中的特定字符串开始引入注释,并将结果分离为单独的列。在Oracle中将varchar拆分为单独的列

例如 - 如果返回的值是这样的:

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

回报必须是:

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

它甚至可以定义列,一旦结果集已刚刚结构为了将一个字符串分成两个?

回答

34

取决于数据的一致性 - 假定一个单一的空间就是你要出现在一列VS 2之间有什么隔膜:

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 +有正则表达式的支持,允许取决于更大的灵活性你需要解决的情况。它也有一个正则表达式的子方法...

参考:

+2

小细节...这将包括空间作为输出中第一列的一部分。你可能希望这是SUBSTR(t.column_one,1,INSTR(t.column_one,'')-1) – Craig 2011-03-04 23:09:45

+1

@Craig:Corrected - thx! – 2011-03-05 00:36:08

+0

不错。谢谢您的帮助。 – ryebr3ad 2011-03-07 01:41:32

25

随着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; 
+0

这是非常有用的,但它只适用于一个字符(空白字符)。你如何修改这个以处理多个字符,一个保证内容不存在的字符(例如'' - >'~~'或其他不寻常的东西)? – 2014-12-16 10:16:34

+0

我知道我在重振一个老问题,@CharlesHenry--你试过了吗?只需用~~'select regexp_substr('123 ~~ 45,6,7','[^ ~~] +',1,1),regexp_substr('123 ~~ 45,6,7',' [^ ~~] +',1,2)from' – 2015-03-30 20:14:19

+0

我结束了使用CASE和NVL语句来使它工作。它运行**比正则表达式快得多,因为这些函数是Oracle的核心部分。 – 2015-04-28 12:34:11

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; 
+0

虽然可以创建一个以这种方式运行的流水线函数,但split不是Oracle中的内置函数。 – Allan 2014-10-24 19:59:03

+0

Allan,这里是oracle中的函数详细信息,链接http://docs.oracle.com/cd/E13292_01/pt849pbr0/eng/psbooks/tpcl/chapter.htm?File=tpcl/htm/tpcl02.htm – bluesky 2014-10-24 20:53:02

+0

这就是Peopletools文档,而不是Oracle RDBMS。 – Allan 2014-10-24 20:55:46

相关问题