Я работаю с OracleXE, у меня есть файлы, в именах которых есть символ пола или подчеркивания ( ) _
. Пример:
uno_dos_tres_cuatro.csv
A_B_C_D.csv
arbol_mesa_pizza_oregano.csv
Я хочу разделить эти поля (разной длины) на 4 отдельных столбца.
Я использовал следующее выражение, но этот оператор возвращает только первое поле в строке:
SELECT REGEXP_SUBSTR(NOMBRE_COMPLETO, '[^_]+[^_]+') FROM ARCHIVO;
Моя идея заключается в том, что он возвращает 4 поля без расширения .csv
в конце:
| columna 1 | columna 2 | columna 3 | columna 4 |
|-----------|-----------|-----------|-----------|
| uno | dos | tres | cuatro |
| A | B | C | D |
| arbol | mesa | pizza | oregano |
Это пример моей таблицы:
CREATE TABLE tabla ("id" int, "nombre_archivo" varchar2(34));
INSERT ALL
INTO tabla ("id", "nombre_archivo")
VALUES (1, 'uno_dos_tres_cuatro.csv')
INTO tabla ("id", "nombre_archivo")
VALUES (2, 'A_B_C_D.csv')
INTO tabla ("id", "nombre_archivo")
VALUES (3, 'arbol_mesa_pizza_oregano.csv')
SELECT * FROM dual;
Разделить на столбцы (общий случай)
Когда разделитель представляет собой один символ , мы сопоставляем любой текст, кроме разделителя
c
:Пример для
'_'
:и когда мы передаем 1 в параметре
&num_item
, он вернет первый элемент при разделении строки; 2 на второй и т.д.Вместо этого, если разделитель имеет более одного символа :
Пример для
'~~'
:Последний
1
параметр указывает на возврат текста, который соответствует первому набору скобок.В обоих случаях, если вы хотите игнорировать пустые элементы (два разделителя подряд), вам нужно изменить
*
на+
.Отделить, удалив
.csv
с концаИдея состоит в том, чтобы соответствовать:
[^_]+
)(_|(\.csv)?$)
_
, или(\.csv)?$
расширение файла (необязательно), за которым следует конец текста.Итак, у нас есть регулярное выражение:
где нас интересует получение текста первой группы (первый набор скобок).
И мы передаем это регулярное выражение функции REGEXP_SUBSTR().
num_coincidencia
Мы собираемся изменить его для каждого из 4 столбцов.grupo
будет 1 (текст, соответствующий первым скобкам)Код:
Результат
демонстрация:
http://sqlfiddle.com/#!4/07d59/2/0