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 37876 게시물 읽기
No. 37876
case when 오동작??
작성자
이용찬
작성일
2010-08-20 10:57ⓒ
2010-08-20 11:07ⓜ
조회수
3,574

오라클 10g  사용하고 있는데요..

아래 Case When 절을 사용하려고 하는데....

값이 이상하게 나오네요~

select TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') a
      ,TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') b
      ,TO_CHAR(TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') c
      ,TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') d
from dual

 

결과
a                      b                      c                        d
2010-07-31   2010-08-20   2010/07/31     0000/00/00

왜 그럴까요?/

제가 먼가 잘못 사용하고 있는건가요?

오라클 버그인가요????

 

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

a                                      b                                   c                        d

07/31/2010 00:00:00 08/20/2010 00:00:00 2010/07/31 2010/08/20

 

저는 맞게 나오는데요..

착한넘(agoodman99)님이 2010-08-20 12:17에 작성한 댓글입니다.

그런가요?  어떤 툴에서 실행하셨어요?

저는 Toad, PL/SQL Developer,  SQL*Plus 에서 모두 실행해봤는데..  전부 0000/00/00 으로 나오네요..

환경의 문제일까요?

 

이용찬님이 2010-08-20 12:35에 작성한 댓글입니다.
이 댓글은 2010-08-20 12:36에 마지막으로 수정되었습니다. Edit

tool는 Golden입니다.

 

혹시 모르니 CASE문을 (CASE .. END)로 묶어 보시죠..

착한넘(agoodman99)님이 2010-08-20 12:59에 작성한 댓글입니다.

아래처럼 해보실래요.
혹시, 마지막 컬럼값을 못가져오는 것이 아닐까 싶으네요.
만약, 마지막 컬럼값이 오동작한다면... 오라클 버그로 올려야 되지 않을까 싶으네요.

 

select TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') d
      ,TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') a
      ,TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') b
      ,TO_CHAR(TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') c
from dual
;
select TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') a
      ,TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') b
      ,TO_CHAR(TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') c
      ,TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') d
      ,'' t
from dual
;
 

김대훈(willtuner)님이 2010-08-20 13:21에 작성한 댓글입니다.
이 댓글은 2010-08-20 13:25에 마지막으로 수정되었습니다.

이것저것 다 해봐도 안되는데요~

혹시 다른분들은 다 되남요??

 

이용찬님이 2010-08-20 13:53에 작성한 댓글입니다. Edit

신기한 경우네요~ ^^

사용하시는 모든툴에서 안되신다니..

 

오라클에 직접 상담받으시는게 나을런지 말입니다.

 

시스템 문제 같은데...

암비님이 2010-08-20 13:58에 작성한 댓글입니다. Edit

1. 아래 결과에서 어떤 이상한 부분은 없는지 확인해 보실래요
select DUMP(TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD')                       ) a
      ,DUMP(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD')                       ) b
      ,DUMP(TO_CHAR(TO_DATE(CASE WHEN 1 = 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') ) c
      ,DUMP(TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') ) d
from dual
;

제 환경 :
Typ=13 Len=8: 7,218,7,31,0,0,0,0
Typ=13 Len=8: 7,218,8,20,0,0,0,0
Typ=1 Len=10: 50,48,49,48,47,48,55,47,51,49
Typ=1 Len=10: 50,48,49,48,47,48,56,47,50,48

2. 아래 쿼리의 결과도 궁금합니다.
SELECT '<= 9999/12/31'  GB
FROM   DUAL
WHERE  TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') <= '9999/12/31'
UNION ALL
SELECT '> 9999/12/31'
FROM   DUAL
WHERE  TO_CHAR(TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD'),'YYYY/MM/DD') > '9999/12/31'
UNION ALL
SELECT '> TO_DATE(20100830,YYYYMMDD)'
FROM   DUAL
WHERE  TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') > TO_DATE('20100830','YYYYMMDD')
UNION ALL
SELECT '<= TO_DATE(20100830,YYYYMMDD)'
FROM   DUAL
WHERE  TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') <= TO_DATE('20100830','YYYYMMDD')
UNION ALL
SELECT '= TO_DATE(20100820,YYYYMMDD)'
FROM   DUAL
WHERE  TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') = TO_DATE('20100820','YYYYMMDD')
UNION ALL
SELECT '= TO_DATE(20100731,YYYYMMDD)'
FROM   DUAL
WHERE  TO_DATE(CASE WHEN 1 < 1 THEN '20100731' ELSE '20100820' END,'YYYYMMDD') = TO_DATE('20100731','YYYYMMDD')
;

제 환경 :
<= 9999/12/31
<= TO_DATE(20100830,YYYYMMDD)
= TO_DATE(20100820,YYYYMMDD)

어떻게 나오시나요?
 

김대훈(willtuner)님이 2010-08-20 14:27에 작성한 댓글입니다.

첫번째 값은 다르게 나옵니다.

Typ=13 Len=8: 7,218,7,31,0,0,0,0
Typ=12 Len=7: 120,110,8,20,1,1,1
Typ=1 Len=10: 50,48,49,48,47,48,55,47,51,49
Typ=1 Len=10: 48,48,48,48,47,48,48,47,48,48

 

두번째 값은... 두개는 같게 나오고,,, 3번째 로우가 안나옵니다.

<= 9999/12/31
> TO_DATE(20100830,YYYYMMDD)
 

추가로~~~~

9i DB에서 수행한 결과    문제의 쿼리 결과가 제대로 나왔습니다.

이용찬님이 2010-08-20 15:18에 작성한 댓글입니다.
이 댓글은 2010-08-20 15:57에 마지막으로 수정되었습니다. Edit

쿼리 자체는 문제가 없어 보입니다..

"Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production" 버젼에서는 문제없이 결과가 나오네요..

 

혹시 1 < 1 부분은 1 <> 1 또는 1 != 1 로 바꿔서 수행해 보시는 것은 어떨런지요..

 

 

知音님이 2010-08-20 22:32에 작성한 댓글입니다. Edit

오라클에 버그로 등록하시는게 좋을듯 하네요.

김대훈(willtuner)님이 2010-08-26 11:24에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
37880쿼리 속도 개선 및 DataSet 의 검색속도개선점
아이오
2010-08-20
2747
37879삭제 후 commit 데이터 복구관련 질문 드립니다. [2]
빛을타고
2010-08-20
2952
37878특정기간동안 기준일자가 포함되었는지 학인하는 sql은 어떻게.. [2]
염정훈
2010-08-20
2949
37876case when 오동작?? [10]
이용찬
2010-08-20
3574
37875export->imp 한글 깨짐.
이슬이
2010-08-19
3816
37874기존데이터를 변동하지 않고 테이블에 새로운 컬럼추가하고자 합니다. [2]
신입
2010-08-19
3227
37873유동적인 조직도를 구현하려면 어떻게 해야하나요 ? [3]
simon
2010-08-19
3199
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다