我有点挑剔:我被要求从数据库中的特定字符串开始收集注释,并将结果分成不同的列。
例如 - 如果返回的值是:
COLUMN_ONE
--------------------
'D7ERROR username'
回报必须是:
COL_ONE COL_TWO
--------------------
D7ERROR username
一旦结构集的结构只是为了将字符串拆分为两个,是否可以定义列?
答案 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;