조건에 가장 정확한 것을 기준으로 없으면 상위로 올라가는 찾는 로직에 대해 문의합니다.
아래와 같은 데이타에 인덱스가 COUNTRY, DO, SI 순으로 생성되어 있을 경우
조건이 DO 와 SI 를 파리미터로 받는 다고 하면
WITH T AS( SELECT '대한민국' AS COUNTRY
, '경기도' AS DO
, '평택' AS SI
FROM DUAL
UNION ALL
SELECT '대한민국' AS COUNTRY
, '경기도' AS DO
, '화성' AS SI
FROM DUAL)
SELECT *
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도'
AND SI = '?'
1) 옛날(?) 방식 - 오라클에서 권하는 방식은 아니지만 논리적으로 왠지 명확하다고 할까...
먼저 COUNT 해서 개수를 구한뒤 가져오는 방식,
제가 생각하는 단점은 SQL 을 여러번 실행한다. 소스기 길어진다.
장점은 가장 처음에 걸릴경우 가장 인덱스를 잘 탈수도 있다고 생각합니다.
SELECT COUNT(*)
INTO v_count
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도'
AND SI = '화성';
IF v_count > 0 THEN
SELECT si
INTO v_region
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도'
AND SI = '화성';
ELSE
SELECT count(*)
INTO v_region
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도';
...
..
END IF;
2) 1방식의 변형으로 사용하는 방식
begin
SELECT si
INTO v_region
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도'
AND SI = '화성';
exception
when no_data_found then
SELECT do
INTO v_region
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도' ;
exception
when others then
null;
end;
3) 제가 쓰는 방식은 아래와 같은 방식을 사용하는데 인덱스를 범위로 타게 되고 그룹핑 함수 사용에 따른
리소스 사용이 있는데 여러분은 어떤 방식을 즐겨 사용하시나요?
SELECT NVL(MAX(DECODE(SI,'화성', SI)),MAX(DO))
INTO v_region
FROM T
WHERE COUNTRY = '대한민국'
AND DO = '경기도'
더 좋은 방식이 있으면 공유 부탁드려요.