I want to share my experience about to extract records by Query,
so I am writing this article in order to explain it.
The example in this article rely on the following test
table. This sample used (+) for separating between string.
Create table
create table test_extract(f1 number, f2 varchar2(3000)) /
Insert sample data
insert into test_extract(f1,f2) values(100,'MC0051+MC0053+MC0055+MC0059+MC0061+MC0134+MC0135+MC0136+MC0149+MC0150+MC0151') / insert into test_extract(f1,f2) values(200,'CR0219+CR0229') / commit /
Extract Query
--Step 1 --simple query SELECT f2 AS str, f1 as SRL FROM test_extract / MC0051+MC0053+MC0055+MC0059+MC0061+MC0134+MC0135+MC0136+MC0149+MC0150+MC0151 100 CR0219+CR0229 200 --Step 2 --merge two fields SELECT REPLACE ( str, '+', ':' || SRL || '+') || ':' || SRL AS str, SRL FROM (SELECT f2 AS str, f1 as SRL FROM test_extract ) / MC0051:100+MC0053:100+MC0055:100+MC0059:100+MC0061:100+MC0134:100+MC0135:100+MC0136:100+MC0149:100+MC0150:100+MC0151:100 100 CR0219:200+CR0229:200 200 --Step 3 --makes one record --Here we see a simple example of the LISTAGG function, producing a comma-separated list of string SELECT LISTAGG (str, ',') WITHIN GROUP (ORDER BY SRL) AS str FROM (SELECT REPLACE ( str, '+', ':' || SRL || '+') || ':' || SRL AS str, SRL FROM (SELECT f2 AS str, f1 as SRL FROM test_extract )) / MC0051:100+MC0053:100+MC0055:100+MC0059:100+MC0061:100+MC0134:100+MC0135:100+MC0136:100+MC0149:100+MC0150:100+MC0151:100,CR0219:200+CR0229:200 --Step 4 --In this section we create a dataset and nested table SELECT apex_string.split (REPLACE (str, ',', '+'), '+') AS str FROM (SELECT LISTAGG (str, ',') WITHIN GROUP (ORDER BY SRL) AS str FROM (SELECT REPLACE ( str, '+', ':' || SRL || '+') || ':' || SRL AS str, SRL FROM (SELECT f2 AS str, f1 as SRL FROM test_extract ))) --Step 5 --Final query that we get all records SELECT REGEXP_SUBSTR (COLUMN_VALUE, '[^:]+', 1, 1) "PARAM_VALUE", REGEXP_SUBSTR (COLUMN_VALUE, '[^:]+', 1, 2) "SRL" FROM TABLE ( SELECT apex_string.split (REPLACE (str, ',', '+'), '+') AS str FROM (SELECT LISTAGG (str, ',') WITHIN GROUP (ORDER BY SRL) AS str FROM (SELECT REPLACE ( str, '+', ':' || SRL || '+') || ':' || SRL AS str, SRL FROM (SELECT f2 AS str, f1 as SRL FROM test_extract )))) ---result PARAM_VALUE SRL MC0051 100 MC0053 100 MC0055 100 MC0059 100 MC0061 100 MC0134 100 MC0135 100 MC0136 100 MC0149 100 MC0150 100 MC0151 100 CR0219 200 CR0229 200
I hope to enjoy.
No comments :
Post a Comment