한국 | 미국 | 일본 | 지역 |
A | 미국,일본 | ||
A | A | 한국,일본 | |
A | A | 한국,미국,일본 |
각 지역에 있는 값을 보고 해당 지역에 A가 들어있는지 확인하는 쿼리를 짜고싶은데 가능할까요?
예를 들면
첫번째 행에 지역이 미국,일본인데
미국에만 A가 들어가 있습니다. 미국,일본 두개에 A가 있어야 하는데 일본이 없기 떄문에 해당 행을 출력 해야합니다.
위에서 출력 되어야 하는 값은
첫번째 행과 세번 째 행입니다.
두번째 행은 지역에 있는 조건에 만족하므로 출력되지 않아야하구요.(한국과 일본에 둘다 A가 존재)
도움부탁드립니다!
with t as ( select null kor, 'A' us, null jp, '미국,일본' rgn from dual union all select 'A' kor, null us, 'A' jp, '한국,일본' rgn from dual union all select 'A' kor, null us, 'A' jp, '한국,미국,일본' rgn from dual ) select * from t where nvl(decode(kor,'A','1')||decode(us,'A','2')||decode(jp,'A','3'),'*') != nvl(decode(sign(instr(rgn,'한국')),1,'1')||decode(sign(instr(rgn,'미국')),1,'2')||decode(sign(instr(rgn,'일본')),1,'3'),'*')
WITH T (KOR, USA, JPN, AREA) AS ( SELECT NULL, 'A', NULL, '미국,일본' FROM DUAL UNION ALL SELECT NULL, 'A', 'A', '일본,미국' FROM DUAL UNION ALL SELECT 'A', NULL, 'A' , '한국,일본' FROM DUAL UNION ALL SELECT 'A', 'A', 'A' , '한국,일본' FROM DUAL UNION ALL SELECT 'A', 'A', 'A' , '한국,한국' FROM DUAL UNION ALL SELECT 'A', NULL, 'A' , '한국,미국,일본' FROM DUAL ) SELECT * FROM T WHERE NOT( NVL2(KOR, 1, 0) = REGEXP_COUNT(AREA, '한국') AND NVL2(USA, 1, 0) = REGEXP_COUNT(AREA, '미국') AND NVL2(JPN, 1, 0) = REGEXP_COUNT(AREA, '일본'));
요청사항에 나와있지 않는 경우의 수가 더 있습니다.
위 쿼리를 보시고 원하시는 데이터인지 확인해보세요.
WITH t AS ( SELECT '' 한국, 'A' 미국, '' 일본, '미국,일본' 지역 FROM dual UNION ALL SELECT 'A', '', 'A', '한국,일본' FROM dual UNION ALL SELECT 'A', '', 'A', '한국,미국,일본' FROM dual ) SELECT * FROM t WHERE NVL2(한국, 1, 0) != SIGN(INSTR(지역, '한국')) OR NVL2(미국, 1, 0) != SIGN(INSTR(지역, '미국')) OR NVL2(일본, 1, 0) != SIGN(INSTR(지역, '일본')) ;