我有點尷尬:我被要求從數據庫中的特定字符串開始引入註釋,並將結果分離爲單獨的列。在Oracle中將varchar拆分爲單獨的列
例如 - 如果返回的值是這樣的:
COLUMN_ONE
--------------------
'D7ERROR username'
回報必須是:
COL_ONE COL_TWO
--------------------
D7ERROR username
它甚至可以定義列,一旦結果集已剛剛結構爲了將一個字符串分成兩個?
我有點尷尬:我被要求從數據庫中的特定字符串開始引入註釋,並將結果分離爲單獨的列。在Oracle中將varchar拆分爲單獨的列
例如 - 如果返回的值是這樣的:
COLUMN_ONE
--------------------
'D7ERROR username'
回報必須是:
COL_ONE COL_TWO
--------------------
D7ERROR username
它甚至可以定義列,一旦結果集已剛剛結構爲了將一個字符串分成兩個?
隨着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;
這是非常有用的,但它只適用於一個字符(空白字符)。你如何修改這個以處理多個字符,一個保證內容不存在的字符(例如'' - >'~~'或其他不尋常的東西)? – 2014-12-16 10:16:34
我知道我在重振一個老問題,@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
我結束了使用CASE和NVL語句來使它工作。它運行**比正則表達式快得多,因爲這些函數是Oracle的核心部分。 – 2015-04-28 12:34:11
簡單的方法是轉換成列
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;
小細節...這將包括空間作爲輸出中第一列的一部分。你可能希望這是SUBSTR(t.column_one,1,INSTR(t.column_one,'')-1) – Craig 2011-03-04 23:09:45
@Craig:Corrected - thx! – 2011-03-05 00:36:08
不錯。謝謝您的幫助。 – ryebr3ad 2011-03-07 01:41:32