database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39648 게시물 읽기
No. 39648
where절에 case문 질문입니다.
작성자
준(BBANGGGU)
작성일
2012-09-19 18:37
조회수
5,665

with tt as (
SELECT 'A' cd, 1 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'B' cd, 1 car_ton_cd, 30000 sale_amt FROM dual union all
SELECT 'C' cd, 5 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'D' cd, 5 car_ton_cd, 90000 sale_amt FROM dual union all
SELECT 'E' cd, 1 car_ton_cd, 50000 sale_amt FROM dual
)
select * from tt
where sale_amt >= case when car_ton_cd <= 3 then 40000 else 80000 end
 

간단한 퀴리입니다.

car_ton_cd가 3이하일때는 sale_amt가 40000이상이고,

car_ton_cd가 4이상일때는 sale_amt가 80000이상인 데이터를 뽑아내려고 만든 쿼리인데,

결과는 영 이상하게 나오네요..

A,D,E가 나와야 정상인데..  C,D가 나옵니다.

왜그럴까요?

 

이 글에 대한 댓글이 총 4건 있습니다.

with tt as (
SELECT 'A' cd, 1 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'B' cd, 1 car_ton_cd, 30000 sale_amt FROM dual union all
SELECT 'C' cd, 5 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'D' cd, 5 car_ton_cd, 90000 sale_amt FROM dual union all
SELECT 'E' cd, 1 car_ton_cd, 50000 sale_amt FROM dual
)
select cd
     , car_ton_cd
     , sale_amt
from   tt a
where  sale_amt >= to_number(case when car_ton_cd <= 3 then 40000 else 80000 end)

hanul072(hanul072)님이 2012-09-20 00:14에 작성한 댓글입니다.

버그네요.

Case 문만의 문제가 아니라

Case 문과 With 문이 만나서 문제인듯 하네요.

테이블 생성해서 테스트하면 이상 없네요.

마농(manon94)님이 2012-09-20 11:12에 작성한 댓글입니다.

 with tt as (

SELECT 'A' cd, 1 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'B' cd, 1 car_ton_cd, 30000 sale_amt FROM dual union all
SELECT 'C' cd, 5 car_ton_cd, 50000 sale_amt FROM dual union all
SELECT 'D' cd, 5 car_ton_cd, 90000 sale_amt FROM dual union all
SELECT 'E' cd, 1 car_ton_cd, 50000 sale_amt FROM dual
)
select * from tt
where sale_amt >= case when car_ton_cd <= '3' then '40000' else '80000' end
 
이렇게 하시면 제대로 나올겁니다..(10g 기준)
 
추측이긴 하지만 with 구문안의 컬럼과 형변환 과정에서 원치않는 방향으로 값비교가 일어나는게 아닐까 합니다.
 
참고로 11g에서는 원래 구문으로 해도 원하시는 값이 제대로 나옵니다(11g new feature에서 관련내용을 본 듯 한데 가물가물 하네요)
viatoris님이 2012-09-20 13:17에 작성한 댓글입니다. Edit

답변주신분들 감사합니다.

제 환경은 10g이구요

with 절을 안쓰고 from절에 inline view로 바로 써넣어도 안되는걸 보니

tmp테이블과 case문이 뭔가 안맞는게 있는가봅니다.

다행히 실제 테이블로 테스트해보니 잘 됩니다..

11g에서는 버그가 잡혔나보군요 ^^

감사합니다.

 

준(BBANGGGU)님이 2012-09-20 13:30에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39652오라클 기준점을 기준으로 잘라내기 [3]
나그네
2012-09-21
4496
39651특정시간대에 있는 데이터 구하기 [1]
똥줄
2012-09-21
4243
39649hanul072님 아래 where절에 case문에 대해 추가 질문 있습니다.
2012-09-20
4122
39648where절에 case문 질문입니다. [4]
2012-09-19
5665
39646시간대별 근무자 현황표를 만드는데요...도움좀주세요.. [1]
조원근
2012-09-19
5537
39645오라클 8i 윈도우용 odbc를 급하게 구합니다.
조성연
2012-09-19
4314
39644공백을 찾아서 나머지는 지우고싶은데요.. [2]
모르겠어요
2012-09-18
4530
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다