2015-11-12 2 views
0

Я хочу разбить столбец разделителями (|) в oracle db. Как я могу это сделать?Oracle SQL Split by Delimiters Without Store Процедура/функция

В дб значения будут сохранены как:

поле

AP1|Apple Juice|100 

Я хочу, чтобы отделить его стать:

Field1 | Field2 | Field3

AP1 Apple Juice 100  

Я не знаю, какой именно запрос для этого, но в основном ниже, это то, что я хочу.

select split(Field) as Field1, split(Field) as Field2, split(Field) as Field3 

Я хотел использовать только SQL (без создания какой-либо процедуры или функции хранилища).

+0

Существуют различные решения в посте я идентифицированной. Выберите тот, который соответствует вашей версии и другим требованиям. Вероятно, решение SQL с регулярным выражением проще всего реализовать. (Все решения используют ',' как разделитель, поэтому замените это на '|'). – APC

+0

Извините, забыл упомянуть, я хотел использовать только запрос (без создания процедуры хранения, функции), но приведенные примеры использовали его. – hades

+0

Хорошо, я снова открыл его. – APC

ответ

5

С регулярным выражением:

with sample_data as 
    (select 'AP1|Apple Juice|100' str 
    from dual 
) 
select str, 
    regexp_substr(str, '[^|]+', 1, 1) str1, 
    regexp_substr(str, '[^|]+', 1, 2) str2, 
    regexp_substr(str, '[^|]+', 1, 3) str3 
from sample_data; 
+0

Хммм, мне явно нужно улучшить мое регулярное выражение. – APC

+0

спасибо @Renaud Kern – hades

1

Вы можете сделать это в чистом SQL с использованием SUBSTR и Instr для извлечения подстроки между разделителем |.

Для простых манипуляций с строками, я предпочитаю SUBSTR + INSTR подход, так как это still faster than the REGEXP. Конечно, с недавними выпусками, разница в производительности снижается, однако REGEXP по-прежнему более интенсивно работает по ЦП, чем старый SUBTR+INSTR.

Например,

SQL> WITH sample_data AS 
    2 (SELECT 'AP1|Apple Juice|100' str 
    3 FROM dual 
    4 ) 
    5 -- end of sample_data mocking as a table 
    6 SELECT str, 
    7   SUBSTR(str, 1, instr(str, '|', 1,1) -1) str1, 
    8   SUBSTR(str, instr(str, '|', 1, 1) + 1, 
    9     instr(str, '|', 1, 2) - 
10     instr(str, '|', 1, 1) -1) str2, 
11   SUBSTR(str, instr(str, '|', 1, 2) + 1) str3 
12 FROM sample_data; 

STR     STR1    STR2    STR3 
------------------- ------------------- ------------------- ---- 
AP1|Apple Juice|100 AP1     Apple Juice   100 

На стороне записки, вы не должны хранить данные в виде строки с разделителями, это действительно плохой дизайн. Вы должны нормализовать это как постоянное исправление. Насколько возможно, сохраните атрибуты в разных столбцах, тогда у вас нет накладных расходов на обработку строки для извлечения соответствующих атрибутов.

+0

Использование простой старой старой 'instr()' + 'substr()' комбо в эти дни, полный regexp's. Мне нравится этот ответ. – nop77svk

+0

@ nop77svk Да, это зависит. Это был простой тестовый пример. –

+0

спасибо за ответ, да понял, что это не очень хороший дизайн. – hades

 Смежные вопросы

  • Нет связанных вопросов^_^