2015-10-13 4 views
1

У меня есть таблица, какоракул разделение запятыми строку на столбцы

Charge_num  mapping_col 
---------  ----------- 
p1.pm.100  1.1.1,1000 
p1.pm.110  1.2.1,1000 
p1.pm.120  1.3.1,1000 

мне нужно разделить «mapping_col» в 2 колонки, как это:

Charge_num  wbs  obs 
---------  ---  --- 
p1.pm.100  1.1.1  1000 
p1.pm.110  1.2.1  1000 
p1.pm.120  1.3.1  1000 
+0

На первом месте, почему вы храните данные в виде строк с разделителями? Вы нарушаете ** нормализацию **. Во всяком случае, как обходной путь, просто используйте 'SUBSTR' и' INSTR'. INSTR вернет позицию запятой ',', а затем разделит substr на эту позицию. И помните, что даже с 12c подход SUBSTR + INSTR все еще быстрее, чем REGEX. –

+0

Я не хранил его таким образом, но мне нужно написать отчет, который извлекает данные из этой системы. Когда я впервые обнаружил эту ситуацию, мой первый крик заключался в том, что он нарушил первую нормальную форму. – user2378895

+0

«* он нарушил первую нормальную форму *« Конечно, это нарушает основные правила. Во всяком случае, я думаю, вы могли бы применить обходной путь на данный момент. И предложите исправление дизайна как постоянное решение для вашей организации. Вы даже можете создать ** виртуальные столбцы **. Удачи! –

ответ

1
select charge_num, 
substr(mapping_col,1,instr(mapping_col,',',1)-1) AS first_half, 
substr(mapping_col, instr(mapping_col,',',1)+1) as last_half 
from your_table 

Обратите внимание, что на практике хранения чисел, поскольку строки подвержены ошибкам. Если вы должны были направить эти результаты как NUMBER (9), это может непредсказуемо нарушиться, если ваши данные нерегулярны.

+1

@Boneist спасибо, исправлено ... – kevinsky

+0

«* Обратите внимание, что практика хранения чисел в виде строк подвержена ошибкам. Если бы вы произвели эти результаты как NUMBER (9), это могло бы непредсказуемо нарушиться, если ваши данные нерегулярны * Ну, я в какой-то степени согласен с вами. Однако есть исключения. Обратите внимание, что многие страны следуют определенным нормам своих данных, из-за которых вы обязаны хранить данные в виде строки с разделителями. –

1

REGEXP_SUBSTR на помощь!

with sample_data as (select 'p1.pm.100' charge_num, '1.1.1,1000' mapping_col from dual union all 
        select 'p1.pm.110' charge_num, '1.2.1,1000' mapping_col from dual union all 
        select 'p1.pm.120' charge_num, '1.3.1,1000' mapping_col from dual) 
select charge_num, 
     regexp_substr(mapping_col, '[^,]+', 1, 1) wbs, 
     regexp_substr(mapping_col, '[^,]+', 1, 2) obs 
from sample_data; 

CHARGE_NUM WBS       OBS       
---------- ------------------------------ ------------------------------ 
p1.pm.100 1.1.1       1000       
p1.pm.110 1.2.1       1000       
p1.pm.120 1.3.1       1000   
+0

Производительность регулярных выражений, очевидно, улучшается с каждым новым выпуском. +1 –

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