2017-02-18 8 views
0

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

select listagg(request_num,',') within group (order by request_num) as request_num,segmentation_name from (
select MST.REQUEST_NUM,seg_dtls.SEGMENT_NAME,LAST_UPDATED_date,seg_dtls.segmentation_name from 
(select * from rp_sr_master) Mst, 
(select SUBSTR(ANSWER,1,INSTR (ANSWER, '~', 1)-1) AS SM_ID,sr_id from rp_sR_details 
WHERE Q_ID in (SELECT Q_ID FROM RP_QUESTIONS WHERE field_id='LM_LRE_Q6') 
    ) Dtls, (select SM_ID, SQL_STATEMENT, CREATION_DATE, UPDATED_DATE, SEGMENT_NAME,segmentation_name ,TOTAL_COUNT 
from rp_sEGMENT_master) seg_dtls 
where Dtls.SM_ID=seg_dtls.SM_ID 
and Dtls.sr_id=Mst.sr_id) 
group by segmentation_name; 

Проблема я столкнулся здесь в следующем,

(select SUBSTR(ANSWER,1,INSTR (ANSWER, '~', 1)-1) AS SM_ID,sr_id from rp_sR_details 
    WHERE Q_ID in (SELECT Q_ID FROM RP_QUESTIONS WHERE field_id='LM_LRE_Q6') 
     ) 

В приведенном выше коде, ответ будет что-то вроде этого:

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

Он выбирает только первый номер то есть 2603, а другие будут исключены.

Есть ли способ, которым я могу пройти через все число в этом «ANSWER». Я ищу идеи.

Спасибо.

ответ

1

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

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 | 

Я верю, что вам удастся объединить этот простой «синтаксический» запрос в ваш основной запрос.

+0

спасибо, я пытаюсь учиться. Вот мои больше сомнений. '\ d +' находит цифры в выражении. Я в ситуации, когда ответ будет похож на 345 ~ nas 2016^234 ~ ras2034^34_234^help 3. здесь я попробовал regsub, чтобы найти цифры между^и ~, но первая цифра не будет. Я попробовал это [0-9] * (? = ~). – user3165555