-
[Oracle/SQL] NOT EXISTS, IS NULL, CASE WHEN 다중 입력조건 검색 쿼리문개발자 레퍼런스 2009. 9. 7. 23:53반응형오라클(Oracle)의 SQL 쿼리 정리 입니다.
개별적인 값일 경우 A <> B 를 하면 C에서 A != B 와 같은 뜻으로 동작합니다.
다만 개별값이 아닌 SELECT를 이용한 조회된 그룹 혹은 조회값들이라면 아래와 같이 NOT EXISTS 쿼리문을 WHERE 절에 사용해 줌으로써 여집합의 결과를 얻을 수 있습니다.
AND NOT EXISTS (
SELECT
DISTINCT(b.tup_c) AS tup_c
FROM tb_cs_jh_ch_tupcodesvc b
WHERE substr(b.cd_svc_c,1,2) = '60'
AND A.tup_c = b.tup_c
)
위와 같은 역할을 하는 IS NULL을 사용한 다른 사용법입니다.
AND (
SELECT DISTINCT(b.tup_c) AS tup_c
FROM tb_cs_jh_ch_tupcodesvc b
WHERE substr(b.cd_svc_c,1,2) = '60'
AND A.tup_c = b.tup_c) IS NULL
SELECT를 사용한 단건 혹은 다건조회시 여러가지 옵션을 제공하며 그 옵션을 체크하여 적용시키는 경우.
즉, 여러가지 조건을 동시에 만족하는 것만의 결과값을 구해야 하는 경우 CASE 함수를 활용하여 구할 수 있습니다.
먼저 CASE 함수의 기본 형식을 알아두세요.
* CASE 함수
[ 형식 ]
CASE 컬럼명|표현식 WHEN 조건식1 THEN 결과1
WHEN 조건식2 THEN 결과2
......
WHEN 조건식n THEN 결과n
ELSE 결과
END
아래는 CASE WHEN 조건 분기를 사용하여 여러조건을 동시에 만족하는(교집합) 특정 값들을 얻고, NOT EXISTS 를 써서 특정 결과를 뺀(여집합) 결과를 구하는 쿼리 예제 입니다.
SELECT
A.tup_c AS tup_c
FROM
(
SELECT A.tup_c AS tup_c
, MAX(CASE WHEN B.svc_bzcc = '00' AND :io_all_mcht = '1' THEN '1' ELSE '0' END) AS io_all_mcht
, MAX(CASE WHEN B.svc_bzcc = '01' AND :io_oiling = '1' THEN '1' ELSE '0' END) AS io_oiling
, MAX(CASE WHEN B.svc_bzcc = '02' AND :io_movie = '1' THEN '1' ELSE '0' END) AS io_movie
, MAX(CASE WHEN B.svc_bzcc = '99' AND :io_etc = '1' THEN '1' ELSE '0' END) AS io_etc
FROM TB_CS_JH_CH_TUPCODESVC A
,TB_CS_JH_CM_CARDSVC B
WHERE A.tup_c >= :tup_c
AND NOT EXISTS (
SELECT
DISTINCT(b.tup_c) AS tup_c
FROM tb_cs_jh_ch_tupcodesvc b
WHERE substr(b.cd_svc_c,1,2) = '60'
AND A.tup_c = b.tup_c
)
GROUP BY A.tup_c
) A
WHERE a.tup_c >= :tup_c
AND A.io_all_mcht = :io_all_mcht
AND A.io_oiling = :io_oiling
AND A.io_movie = :io_movie
AND A.io_golf = :io_golf
AND A.io_etc = :io_etc
GROUP BY A.tup_c
ORDER BY A.tup_c
유용하게 사용하시기 바랍니다.반응형'개발자 레퍼런스' 카테고리의 다른 글
[Unix/Linux] VI 에디터 초심자를 위한 필수 명령어 정리 (4) 2010.01.14 [오라클/SQL] 날짜함수(SYSDATE, ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN) , 변환함수(TO_CHAR, NVL), DB속도 튜닝 (0) 2009.11.06 [Oracle/SQL] 오라클 채번시 DECODE, NVL 조건을 사용한 SELECT 단건조회 쿼리문 (0) 2009.06.27 [오라클(ORACLE)/SQL] 디코더 (DECODE) , 케이스 (CASE WHEN) 쿼리문 활용하기 (5) 2009.05.14 [오라클(ORACLE)/SQL] WHERE IN, CASE WHEN THEN END, GROUP BY, DISTINCT, MAX 쿼리문 (0) 2009.04.23