a테이블
SELECT '아래와 같은 문의입니다 기계' text01 FROM dual UNION ALL
SELECT '아래와 같은 문의입니다 도어 조치바랍니다.' text01 FROM dual UNION ALL
SELECT '문의입니다 마루 조치바랍니다.' text01 FROM dual UNION ALL
SELECT '문의입니다 창문' text01 FROM dual UNION ALL
SELECT '문의입니다 책상 조치바랍니다.' text01 FROM dual UNION ALL
SELECT '문의입니다 의자' text01 FROM dual UNION ALL
SELECT '문의입니다' text01 FROM dual
b테이블
SELECT '기계, 도어' text01, '001' code FROM dual UNION ALL
SELECT '책상, 의자' text01, '002' code FROM dual UNION ALL
SELECT '기타' text01, '003' code FROM dual
두개의 테이블이 있습니다.
a테이블의 text01 컬럼에서
b테이블의 text01 컬럼을 조회하여
기계 또는 도어 라는 문구가 있으면 001 코드값을
책상 또는 의자가 있으면 002 값을
그외는 003을 주고 싶습니다.
일일히 따로 sql을 작성하자니 건수가 많다고 해서
가능한한 한번에 조회가 가능한 sql을 만들고자하는데
혹시 어떤방법이 있을까요?
아래는 결과값입니다.
select '아래와 같은 문의입니다 기계' text01, '001' code_re from dual union all
select '아래와 같은 문의입니다 도어 조치바랍니다.'text01, '001' code_re from dual union all
select '문의입니다 마루 조치바랍니다.' text01, '003' code_re from dual union all
select '문의입니다 창문' text01, '003' code_re from dual union all
select '문의입니다 책상 조치바랍니다.' text01, '002' code_re from dual union all
select '문의입니다 의자' text01, '002' code_re from dual union all
select '문의입니다' text01, '003' code_re from dual
with t1 as ( select '아래와 같은 문의입니다 기계' text01 from dual union all select '아래와 같은 문의입니다 도어 조치바랍니다.' text01 from dual union all select '문의입니다 마루 조치바랍니다.' text01 from dual union all select '문의입니다 창문' text01 from dual union all select '문의입니다 책상 조치바랍니다.' text01 from dual union all select '문의입니다 의자' text01 from dual union all select '문의입니다' text01 from dual ) , t2 as ( select '기계, 도어' text01, '001' code from dual union all select '책상, 의자' text01, '002' code from dual union all select '기타' text01, '003' code from dual ) select a.text01 , nvl(to_char(wm_concat(case when regexp_count(a.text01, replace(b.text01, ',', '|')) > 0 then b.code end)), '003') fg from t1 a, t2 b where b.code != '003' group by a.text01
select '아래와 같은 문의입니다 기계' text01, '001' code_re from dual union all
select '아래와 같은 문의입니다 도어 조치바랍니다.'text01, '001' code_re from dual union all
select '문의입니다 마루 조치바랍니다.' text01, '003' code_re from dual union all
select '문의입니다 창문' text01, '003' code_re from dual union all
select '문의입니다 책상 조치바랍니다.' text01, '002' code_re from dual union all
select '문의입니다 의자' text01, '002' code_re from dual union all
select '문의입니다' text01, '003' code_re from dual
이런식으로 보여지면 됩니다
답변감사드립니다. ^^
아.. 9i군요.
with t1 as ( select '아래와 같은 문의입니다 기계' text01 from dual union all select '아래와 같은 문의입니다 도어 조치바랍니다.' text01 from dual union all select '문의입니다 마루 조치바랍니다.' text01 from dual union all select '문의입니다 창문' text01 from dual union all select '문의입니다 책상 조치바랍니다.' text01 from dual union all select '문의입니다 의자' text01 from dual union all select '기타도어문의입니다' text01 from dual ) , t2 as ( select '기계,도어' text01, '001' code from dual union all select '책상,의자' text01, '002' code from dual union all select '기타' text01, '003' code from dual ) select a.text01 , nvl(trim(both ',' from substr(xmlagg(xmlelement(x, ',' , (case when regexp_count(a.text01, replace(b.text01, ',', '|')) > 0 then b.code end)) order by b.code).extract('//text()'), 2)), '003') fg from t1 a, t2 b where b.code != '003' group by a.text01
일단 결과는 나오는데 제가 뭘 잘못했는지.. 왜 trim이 필요한지.. 왜 그럴까요?;
select a.text01 , nvl(trim(both ',' from substr(xmlagg(xmlelement(x, ',' , (case when instr(a.text01, substr(b.text01,1,instr(b.text01,',')-1)) > 0 or instr(a.text01, substr(b.text01,instr(b.text01,',')+1)) > 0 then b.code end)) order by b.code).extract('//text()'), 2)), '003') fg from t1 a, t2 b where b.code != '003' group by a.text01
WITH A AS ( SELECT '아래와 같은 문의입니다 기계 도어' text01 FROM dual UNION ALL SELECT '아래와 같은 문의입니다 도어 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 마루 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 창문' text01 FROM dual UNION ALL SELECT '문의입니다 책상 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 의자' text01 FROM dual UNION ALL SELECT '문의입니다' text01 FROM dual ) , B AS ( SELECT '기계,도어' text01, '001' code FROM dual UNION ALL SELECT '책상,의자' text01, '002' code FROM dual UNION ALL SELECT '기타' text01, '003' code FROM dual ) , C AS ( SELECT CODE , CASE WHEN LV = 1 THEN SUBSTR(B.TEXT01 , 1 , INSTR(B.TEXT01,',',1,1) - 1) WHEN LV = 2 THEN SUBSTR(B.TEXT01 , INSTR(B.TEXT01,',',1,1) + 1 , LENGTH(B.TEXT01)) END VAL FROM B ,( SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 2 ) B ) SELECT DISTINCT TEXT01 , CODE AS CODE_RE FROM A LEFT OUTER JOIN C ON A.TEXT01 LIKE '%' || C.VAL || '%' AND C.VAL IS NOT NULL
WITH a AS ( SELECT '아래와 같은 문의입니다 기계' text01 FROM dual UNION ALL SELECT '아래와 같은 문의입니다 도어 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 마루 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 창문' text01 FROM dual UNION ALL SELECT '문의입니다 책상 조치바랍니다.' text01 FROM dual UNION ALL SELECT '문의입니다 의자' text01 FROM dual UNION ALL SELECT '문의입니다' text01 FROM dual ), b AS( SELECT '기계, 도어' text01, '001' code FROM dual UNION ALL SELECT '책상, 의자' text01, '002' code FROM dual UNION ALL SELECT '기타' text01, '003' code FROM dual ) SELECT a1.text01 ,NVL((SELECT b1.code FROM b b1 WHERE a1.text01 like '%'||(SUBSTR(b1.text01,1,2))||'%' OR a1.text01 like '%'||NVL((SUBSTR(b1.text01,5)),0)||'%' ),'003') code FROM a a1