Вот решение для регулярных выражений, которое не требует жесткого кодирования меток. Подзапрос разбивает строку на каждую вторую запятую, затем основной запрос разбивает результирующую пару на два столбца.
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, ',')-1) as sales
, substr(pr, instr(pr, ',')+1) as ind
from prs
order by 1
;
Вывод выглядит так:
SALES IND
------------------ -----------
annual_sales:79139 annual_ind:A
q1_sales:18155 q1_ind:A
q2_sales:19289 q2_ind:A
q3_sales:19153 q3_ind:A
q4_sales:22543 q4_ind:A
Если вы хотите иметь что-то, что готово для обработки, мы можем придумать:
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, '_')-1) as label
, ltrim(regexp_substr(pr, ':([0-9]+)'), ':') as sales
, substr(pr, -1, 1) as ind
from prs
order by 1
;
Дает вывод:
LABEL SALES IND
------ ----- ---
annual 79139 A
q1 18155 A
q2 19289 A
q3 19153 A
q4 22543 A
Кстати, этот вопрос иллюстрирует мой багбир. Этот вопрос необходим только потому, что входная строка плохо отформатирована. В контенте есть неявная структура, которая не выражена в структуре строки. Это 2018 год, почему мы до сих пор передаем данные вот так? У нас был XML на протяжении десятилетий, JSON с 2001 года. Нет оправдания.
Я согласен, что это более многословно, но насколько легче обрабатывать, насколько надежнее:
"report": {
"annual" : {
"sales" : 79139
, "ind" : A
}
, "q1" : {
"sales" : 18155
, "ind" : A
}
, "q2" : {
"sales" : 19289
, "ind" : A
}
, "q3" : {
"sales" : 19153
, "ind" : A
}
, "q4" : {
"sales" : 22543
, "ind" : A
}
}
Купите, вам не нужно использовать полный JSON. Даже это было бы заметным улучшением:
[annual_sales:79139,annual_ind:A],[q4_sales:22543,q4_ind:A],[q3_sales:19153,q3_ind:A],[q2_sales:19289,q2_ind:A],[q1_sales:18155,q1_ind:A]
По крайней мере, у нас есть надежная запись для связанных пар значений.