2017-02-18 12 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であり、その他は除外されます。

「回答者」のすべての番号をループする方法はありますか? 私はアイデアを探しています。

ありがとうございました。

答えて

1

ひとつのアイデアは、あなたが以下の回答で、この方法の例を見つけることができ
、列にカンマ区切りの文字列を分割するための方法を使用することです:

Splitting comma separated values in Oracle

How can I use regex to split a string, using a string as a delimiter?

上記の解決策regexp_substr機能を使用してください。
オラクルの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行以上を解析しようとすると混乱してしまいますを使用して行うことができます。

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 | 

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; 

上記のクエリは次の形式で、2つの記録や表示から数字を解析します。幸いにも、この問題を解決するのに役立ちますように別の答えがあります


私はこの簡単な「解析」クエリをメインにマージすることができますクエリ。

+0

ありがとう、私は学ぶことを試みています。ここに私の疑問があります。 '\ d +'は式の数字を見つけます。私は答えが345〜nas 2016^234〜ras2034^34_234^help 3のような状況にあります。ここで^と〜の間の桁を見つけるためにregsubを試しましたが、最初の桁に^はありません。私はこれを試しました[0-9] *(?=〜)。 – user3165555

関連する問題