where case절 이상현상 (오류) 질문 0 5 1,932

by hys [SQL Query] where case 오류 이상현상 도와주세요 [2018.10.10 09:42:47]


안녕하세요. 

case절을 where 조건에 넣었을때 이해가 안가는.. 부분이 있어서 질문 하게 되었습니다.

[SQL]

(1) select * from dual

where (case when 1 > 2 then (select count(*) from dual) else 0 end ) > 0;

결과값 : X

(수장)  결과값 : X  (1 Row)

 

(2) select * from dual

where (case when 1 > 2 then (select count(*) from dual) else 0 end )  > 1;

결과값 : null

(수정) 결과값 : 선택된 레코드가 없습니다.

 

(3) select * from dual

where (case when 1 > 2 then (select count(*) from dual) else 0 end ) =1;

결과값 : null

(수정) 결과값 : 선택된 레코드가 없습니다.

 

(4) select * from dual

where (case when 1 > 2 then (select count(*) from dual) else 0 end ) = 0;

결과값 : null

(수정) 결과값 : 선택된 레코드가 없습니다.

 

(5) select * from dual

where (case when 1 > 2 then 1 else 0 end ) > 0;

결과값 : null

(수정) 결과값 : 선택된 레코드가 없습니다.

 

[질문]

(select count(*) from dual) 의 값은 1 이고,

case문에 1>2는 false이기 떄문에 else 로 가야되는데... 왜 (1),(2),(3),(4) 번의 결과값들이 저렇게 나오는지 이해가 안가네요.. (5)번은 결과값이 잘나오고 있습니다.

결국, (select count(*) from dual) 문을 넣으면 값이 생각한데로 안나오네요 

 

제가 case문의 의미를 잘못이해 하고 있는건지...
고수님들 (1),(2),(3),(4) 번이 왜 저렇게 나오는지 구조,원리 설명 부탁드립니다.

---------------------- 추 가 ------------------

마농님 말씀하신데로 제가 표현을 잘못해서 

1 Row , 0 Row 구분해서 결과값을 다시 적었습니다.

제 버전은

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 입니다.

저만 결과값이 다른 이유는.. 버전오류 인가요..? ㅜ

by 우리집아찌 [2018.10.10 10:02:29]

테스트를 어디서 하셨나요? 결과값이 저랑 틀린데요.

4번 SQL 빼놓고는 결국 0 (CASE 문 결과 ) 과 비교(틀리게)하는 값들인데 어떤게 문제인것이지요?

[SQL]

(1)
select * from dual
where (case when 1 > 2 then (select count(*) from dual) else 0 end ) > 0;

결과값 : 선택된 행 없음

 

(2) 
select * from dual
where (case when 1 > 2 then (select count(*) from dual) else 0 end )  > 1;

결과값 : 선택된 행 없음

 

(3) 
select * from dual
where (case when 1 > 2 then (select count(*) from dual) else 0 end ) =1;

결과값 : 선택된 행 없음

 

(4)
select * from dual
where (case when 1 > 2 then (select count(*) from dual) else 0 end ) = 0;

D
-
X


(5)
select * from dual
where (case when 1 > 2 then 1 else 0 end ) > 0;

결과값 : 선택된 행 없음

 

 


by 마농 [2018.10.10 10:08:50]

버그인듯 합니다.
제 버전에서는 정상적으로 나옵니다. 11.2.0.1.0
그리고. 결과값 : null 은 잘못된 표현입니다.
null 이 아니라 결과없음, 0 Row 등으로 표현해야 합니다.
null 이 한건 조회되는 것(1 Row)과 이무것도 조회되지 않는 것(0 Row)의 차이가 명확하게 표현되어야 합니다.


by hys [2018.10.10 17:10:17]

@우리집아찌 @마농 님 댓글달아 주셔서 감사합니다. 

결과값, 오라클 버전 내용 수정해서 다시 올렸습니다.  이것을 버전오류로 봐야되는지 궁금하네요 ㅠ

 


by hys [2018.10.10 17:34:30]

버전 오류 인거 같습니다.

11.2.0.4.0 제외한 11.2.0.3.0 , 11.2.0.1.0 버전은 결과값이 잘나온다고 하네요.


by 마농 [2018.10.10 18:12:28]

버전별 실행계획 비교 확인해 보세요.
쿼리 변환 과정에서 잘못된게 아닐까? 생각되네요.

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