2011-03-04 95 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

相關問題