안녕하세요
TEMPLATE이라는 테이블이 있는데 이 테이블 안에는
USERID(등록자), TYPE(타입), BASE(기본유무), TEAM(팀 유무) 칼럼 등이 있습니다.
TEMPLATE 테이블에서
기본 템플릿을 가져오려고 하는데요,
순서가
1. USERID = '본인' , TYPE = '특정타입', BASE ='1'
2. USERID = '본인', TYPE = '공통타입', BASE ='1'
3. USERID = '본인과 같은 팀의 사용자', TYPE = '특정타입', TEAM='1'
4. USERID = '본인과 같은 팀의 사용자', TYPE = '공통타입', TEAM='1'
1,2,3,4 순으로.. 1의 결과가 존재하지 않으면 2의 쿼리를 실행하여 결과를 나타내는 식으로 하고싶습니다.
기껏 생각한 것이라고는 DECODE밖에 없는데요 ㅜㅜ
(예
SELECT DECODE ( NVL((SELECT ID FROM TEMPLATE WHERE USERID='본인' AND TYPE='특정타입' AND BASE='1'),'') ,'' ,DECODE( NVL((SELECT ID FROM TEMPLATE WHERE USERID='본인' AND TYPE='공통타입' AND BASE='1'),'') ,'' ,DECODE ...... ) )
이런식으로요.. 값이 없을 시 DECODE를 이용해 점차 다음 쿼리를 실행할 수 있도록 만들긴 했습니다..
소스 길이가 너무 길어지다 보니 이것보다 간결하게 표현할 수 있지 않을까 싶은데
제가 아직 잘 몰라 더이상 좋게 만들어 낼 수가 없습니다 ㅠㅠ
알려주시면 감사합니당..
이런방법은 어떻습니까?
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY '파티션단위(없으면 생략)' ORDER BY( CASE WHEN USERID = '본인' AND TYPE = '특정타입' AND BASE = '1' THEN 1 WHEN USERID = '본인' AND TYPE = '공통타입' AND BASE = '1' THEN 2 WHEN USERID = '본인과 같은 팀의 사용자' AND TYPE = '특정타입' AND TEAM = '1' THEN 3 WHEN USERID = '본인과 같은 팀의 사용자' AND TYPE = '공통타입' AND TEAM = '1' THEN 4 ELSE NULL END) ASC) RN , A.* FROM TEMPLATE A) WHERE RN = 1
아 막 더 줄여보고 싶은 욕구가 생기네요.. SELECT SUBSTR ( MAX ( CASE WHEN userid || type || base = '본인특정타입1' THEN '4' || id WHEN userid || type || base = '본인공통타입1' THEN '3' || id WHEN userid || type || base = '본인과 같은 팀의 사용자특정타입1' THEN '2' || id WHEN userid || type || base = '본인과 같은 팀의 사용자공통타입1' THEN '1' || id ELSE NULL END ) , 2 ) FROM template a