where 조건문에 순차적으로 조건이 처리되는걸 해보고싶은데여. 0 5 1,183

by 김연우 [2014.09.04 23:32:43]


첫번째 조건, 두번째 조건, 세번째 조건이 있다고 하면

첫번째 A라는 컬럼에서 1이라는 값이 있으면 그 값으로 데이터가 나오게 하고 

만일 A라는 컬럼에 1이라는 값이 없으면 그다음

B라는 컬럼에는 오늘 날짜랑 비교를 해서 같으면 데이터가 나오고 아니면

그다음 C라는 컬럼에서 4라는 값이 있으면 출력 없으면 데이타가 안나오도록 출력 하고 싶은데..

머리속에 떠오르는게 없습니다.

WHERE 에서 DEOCDE문 처럼 이루어져야 하는데 중간에 현재날짜랑 컬럼날짜랑 비교문같은것도 넣어서  조건자체를 넣기가 안되는것 으로 알고있고~ OR일 경우라고 해두

3가지 중 한가지라도 충족을 하면 나와버리는 케이스가 생길것 같아서 애매할것 같더군요..

 

첫번째 조건에 데이타가 맞아 버리면 두번재 세번째 조건은 궂이 확인할 필요 없이 데이터가 나와야 합니다.

 

만일 첫번째 조건에 안맞으면 두번째 조건에서 확인하여 해당조건이 맞으면 데이터가 나오도록 할려고 하는데

잘 몰라서 이렇게 문의 드립니다.

 

by 아발란체 [2014.09.05 08:50:11]

이런 경우는 SQL 보다 어플리케이션에서 값 존재 여부를 판단하여(조건문)

질의를 선택하는 것이 효과적일 것 같습니다.

SQL를 한번 더 작성해도 가독성 및 성능을 고려하기가 보다 좋을 것 같습니다.


by 비주류 [2014.09.05 08:59:39]
-- 인덱스는 못쓰겠지만 decode로 가능할 것 같긴한데요.
decode(a, 1, 1, decode(trunc(b), trunc(sysdate), 1, decode(c, 4, 1))) = 1

-- decode로 크기 비교 (두 값의 차를 sign 활용)
decode(sign(X-Y), 1, ..., 0, ..., -1, ...)

 


by 마농 [2014.09.05 09:01:13]
SELECT * FROM t
 WHERE a = 1
 UNION ALL
SELECT * FROM t
 WHERE b = TO_CHAR(sysdate, 'yyyymmdd')
   AND NOT EXISTS (SELECT * FROM t WHERE a = 1)
 UNION ALL
SELECT * FROM t
 WHERE c = 4
   AND NOT EXISTS (SELECT * FROM t WHERE a = 1 OR b = TO_CHAR(sysdate, 'yyyymmdd'))
;

 


by 손님 [2014.09.05 09:04:30]
감사합니다 ^^

by 백면서생 [2014.09.05 13:47:51]
-- 저도 한번
select *
from 
(
select a,b,c,grp,rank() over (order by grp) rank
from 
(
select a,b,c
      ,case when a = 1 then 1 
            when b = TO_CHAR(sysdate, 'yyyymmdd') then 2 
            when c = 4 then 3             
            else 9 
       end grp
from t
))
where rank = 1 and grp != 9

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입