Подтвердить что ты не робот

Разделить varchar на отдельные столбцы в Oracle

У меня немного рассол: меня попросили взять комментарии, начиная с определенной строки из базы данных, и разделить результат на отдельные столбцы.

Например, если возвращается возвращаемое значение:

COLUMN_ONE
--------------------
'D7ERROR username'

Возврат должен быть:

COL_ONE    COL_TWO
--------------------
D7ERROR   username   

Можно ли даже определить столбцы после того, как результирующий набор был структурирован только для разделения строки на две?

4b9b3361

Ответ 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;