我有点尴尬:我被要求从数据库中的特定字符串开始引入注释,并将结果分离为单独的列。在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