Разделить varchar на отдельные столбцы в Oracle
У меня немного рассол: меня попросили взять комментарии, начиная с определенной строки из базы данных, и разделить результат на отдельные столбцы.
Например, если возвращается возвращаемое значение:
COLUMN_ONE
--------------------
'D7ERROR username'
Возврат должен быть:
COL_ONE COL_TWO
--------------------
D7ERROR username
Можно ли даже определить столбцы после того, как результирующий набор был структурирован только для разделения строки на две?
Ответы
Ответ 1
Зависит от согласованности данных - при условии, что одно пространство является разделителем между тем, что вы хотите отобразить в столбце один против двух:
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
С 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;
Ответ 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;