Одна идея состоит в том, чтобы использовать метод для разделения запятыми строку на строки,
можно найти примеры этого метода в следующих ответов:
Splitting comma separated values in Oracle
How can I use regex to split a string, using a string as a delimiter?
Вышеуказанные решения использование regexp_substr
функция.
Если вы вникнете в детали Oracle REGEXP_SUBSTR function, вы увидите, что там есть необязательный параметр position
.
Этот параметр может быть объединен с sulution, показанного в этом ответе:
SQL to generate a list of numbers from 1 to 100
(то есть SELECT LEVEL n FROM DUAL CONNECT BY LEVEL <= 100
) в приведенной ниже образом:
with xx as (
select '2603~NG non IaaS IT Professional^2600~NG non IaaS Senior '
|| 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria '
|| 'data profiling IT professiona' as answer
from dual
)
select LEVEL AS n, regexp_substr(answer, '\d+', 1, level) as nbr
from xx
connect by level <= 6
;
Этот запрос производит следующий результат:
N |NBR |
--|-----|
1 |2603 |
2 |2600 |
3 |2598 |
4 |2595 |
5 | |
6 | |
Нам необходимо устранить нулевые значения из res ultset, это можно сделать с помощью простого условия IS NOT NULL
with xx as (
select '2603~NG non IaaS IT Professional^2600~NG non IaaS Senior '
|| 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria '
|| 'data profiling IT professiona' as answer
from dual
)
select LEVEL AS n, regexp_substr(answer, '\d+', 1, level) as nbr
from xx
connect by regexp_substr(answer, '\d+', 1, level) IS NOT NULL
;
N |NBR |
--|-----|
1 |2603 |
2 |2600 |
3 |2598 |
4 |2595 |
Этот запрос работает идеально подходит для одной записи, но запутывается, когда мы пытаемся разобрать 2 или более строк. К счастью, есть еще один ответ на SO, который помогает решить эту проблему:
Is there any alternative for OUTER APPLY in Oracle?
-- source data
WITH xx as (
select 1 AS id,
'2603~NG non IaaS IT Professional^2600~NG non IaaS Senior '
|| 'IT^2598~NG data profiling SENIOR IT professional^2595~Nigeria '
|| 'data profiling IT professiona' as answer
from dual
UNION ALL
select 2 AS id,
'11111~NG non IaaS IT Professional^22222~NG non IaaS Senior '
|| 'IT^2598~NG data 33333 profiling SENIOR IT professional^44~Nigeria '
|| 'data profiling 5 IT professiona 66' as answer
from dual
)
-- end of source data
SELECT t.ID, t1.n, t1.nbr
FROM xx t
CROSS JOIN LATERAL (
select LEVEL AS n, regexp_substr(t.answer, '\d+', 1, level) as nbr
from dual
connect by regexp_substr(t.answer, '\d+', 1, level) IS NOT NULL
) t1;
выше запрос разбирает номера из двух записей и отображает затем в следующем виде:
ID |N |NBR |
---|--|------|
1 |1 |2603 |
1 |2 |2600 |
1 |3 |2598 |
1 |4 |2595 |
2 |1 |11111 |
2 |2 |22222 |
2 |3 |2598 |
2 |4 |33333 |
2 |5 |44 |
2 |6 |5 |
2 |7 |66 |
Я верю, что вам удастся объединить этот простой «синтаксический» запрос в ваш основной запрос.
спасибо, я пытаюсь учиться. Вот мои больше сомнений. '\ d +' находит цифры в выражении. Я в ситуации, когда ответ будет похож на 345 ~ nas 2016^234 ~ ras2034^34_234^help 3. здесь я попробовал regsub, чтобы найти цифры между^и ~, но первая цифра не будет. Я попробовал это [0-9] * (? = ~). – user3165555