1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 1. select idx,id,state from member where state = '1' or state = '2' and closeTime < '현재시간' ; 2. select idx,id,state from member where state = '2' and waitTime < '현재시간' ; |
첫번째 쿼리와 두번째 쿼리를 합치고 싶습니다.
그래서 생각해본 쿼리는..
1 2 3 4 5 6 | select idx,id,state from member where ( (state = '1' or state = '2' ) AND (closeTime < '현재시간' ) ) <=== [1] and ( (state = '2' ) AND (waitTime < '현재시간' ) ) <===[2] |
이런식으로 합치면 두개 합친 값이 나올듯한데 문제는 [1]에서 나온값과 [2]에서 나온값이 구분할수없습니다.
이것을 [1]에서 나온값인지 [2]에서 나온값인지 구분을 할수있을까요?
아 그리고 [1]에서 state = 2와 [2]에서 state = 2가 같기때문에 두개의 조건이 다 성립하게 되면 값이 두개가 나오는데 하나로 합쳐서 [1]과 같이 구분을 주고싶습니다.
생각하신 쿼리는 두 조건이 AND 조건이므로 사실상
1 2 3 4 5 | SELECT IDX, ID, STATE FROM MEMBER WHERE STATE = '2' AND CLOSETIME < '현재시간' AND WAITTIME < '현재시간' |
이 쿼리와 같구요.
쿼리를 합친다고 하셨으므로 두개의 조건이 OR로 묵여야겠죠.
1 2 3 4 | SELECT IDX, ID, STATE FROM MEMBER WHERE ((STATE = '1' OR STATE = '2' ) AND CLOSETIME < '현재시간' ) OR (STATE = '2' AND WAITTIME < '현재시간' ) |
그리고 1번 조건과 2번 조건을 구분하기 위해 구분자를 추가하면
1 2 3 4 5 6 7 | SELECT IDX, ID, STATE CASE WHEN ((STATE = '1' OR STATE = '2' ) AND CLOSETIME < '현재시간' ) THEN '[1]' WHEN (STATE = '2' AND WAITTIME < '현재시간' ) THEN '[2]' END GB FROM MEMBER WHERE ((STATE = '1' OR STATE = '2' ) AND CLOSETIME < '현재시간' ) OR (STATE = '2' AND WAITTIME < '현재시간' ) |
CASE 문에서 1조건이 먼저 타기 때문에 1과 2 모두 해당하더라도 [1]이 출력되겠죠.