Order By Case 0 11 5,048

by AquaMacker [Oracle 기초] [2009.10.20 22:42:55]


안녕하세요.

오래간만에 찾아왔습니다 ^^;

두꺼비는 여전이 두꺼두꺼하고 있습니다 ㅡㅜ

  Order By
   Case
    When vchOrderBy = 'EndDate' Then a.EndDate   
    When vchOrderBy = 'Title' Then a.TITLE   
   End
  Desc;

자 요런걸 해야 합니다. 파라미터를 줘서 order by 칼럼을 바꾸는 거죠...

그런데 ORA-00932 일관성없는 데이타 유형 에러가 나더군요.

EndDate(Date)랑 Title(varchar2)랑 데이타타입이 달라서 그런다고 하는데요.

원래 Case가 이렇습니까 ? 변환함수 쓰면 될 것도 같은데요..

그걸 몰라서 여쭤본 것은 아니고요... Case가 원래 이론 놈인지 해서 여쭙고자 합니다.

꼭 같은 타입으로만 case 되는지 알고 싶습니다. ^^;
(요상한 놈인 것 같아서요 ㅡ0ㅡ)

또 변환을 하면 속도가 느려지는데 그걸 감수 하면서까지 저 쿼리를 써야 하는지

아니면 다른방법이 있는지도 알고 싶습니다.(모 Decode를 쓰면 된다고 본 것 같은데요. Case를 권장한다고 해서요;;;)

 

도움말씀 부탁드리겠습니다 ^__^

오늘 퇴근은 몇시꼬 ㅡㅜ

by 마농 [2009.10.21 07:52:57]
Case 원래 그래요. Decode라고 다르지 않고요.
조건에 따라 쿼리를 분리하시는 것이 좋을듯 합니다.
아니면 Decode를 여러번 쓰세요.
ORDER BY DECODE(vchOrderBy,'EndDate',EndDate) DESC
, DECODE(vchOrderBy,'Title' ,Title) DESC

by AquaMacker [2009.10.21 09:30:49]
마농님 감솨요 ^^;
Case 요놈 참 까탈스럽군요 ㅋ
Decode 요놈으로 먹고 살아보겠습니다 ^^;

오늘퇴근은 빨리 !!!
ㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱ

by 마농 [2009.10.21 09:35:25]
Decode냐? Case냐? 의 문제가 아닙니다. 둘다 똑같아요.

by AquaMacker [2009.10.21 10:04:33]
그러네요 ㅡㅡ;;;
쿼리 분기 외에 깔끔한 방법이 없을까요 ?
TO_CHAR 써서하면 되긴하는데 나중에 속도가 문제가 될 것 같아서 영 쓰기가 좀 그러네요 ㅡㅡ;;;

by 마농 [2009.10.21 10:14:06]
쿼리 분리하는 방법 외에 다른 방법을 제가 위에서 제시 했는데요?

by AquaMacker [2009.10.21 10:29:36]
그러네요 ㅋ
Decode를 여러번 쓰세요 전 요걸
Decode( 여러번~~~~) 이걸 줄 알고 대충보고 했는데
다시 보니 Decode(), Decode() ㅋㅋ

신기한 건 Desc, asc 가 다 먹네요 ㅋㅋ

ORDER BY DECODE(vchOrderBy,'EndDate',EndDate) DESC
, DECODE(vchOrderBy,'Title' ,Title)

이게 되다니 헐~

역쉬 오나클이네요 ㅋㅋㅋ

마농님 감솨요 ^^;

좋은 하루 되세용~~~

by finecomp [2009.10.21 14:47:28]
여담입니다만 데이터량이 많아질수록 TO_CHAR를 써서 성능이 느려지는 것 보다는 만약 근본적으로 대량 Sort를 한다면 ORDER BY가 성능저하의 더 큰 주범입니다...소량은 뭘로해도 성능에 큰 영향을 받지 않으니까요...^^;

원래 쿼리에서 CASE내에 그냥 TO_CHAR() 써도 ORDER BY 체제를 그대로 유지한다면 성능에 그다지 큰 영향은 없을 것 같은데요...;
역시 최적성능은 sort없이 정렬할 수 있는 방법이 가능하냐에 따라 달라지겠죠...;
참고만하세요...;

by finecomp [2009.10.21 14:52:40]
결국 최종결과 rows만큼 CASE + TO_CHAR 나 DECODE 두번이나 함수 수행횟수는 비슷할 듯 합니다만...앞서는 하셨던 성능에 대한 고민은 이제 더는 안하실까봐 굳이 적었습니다...^^;

by AquaMacker [2009.10.21 19:07:09]
firecomp님 감솨요 ^^;

성능은 언제나 이슈입니다.
그래서 다른글에서 CASE 를 추천한 이유가 있던거군요.

그런데 CASE를 쓰게 되면 Desc나 Asc를 못하게 되므로 쿼리 짜기에는 안좋아서;;

쿼리 분기가 가장 좋은 방법인데 글케되면 ;;;

CASE를 써서 Decode()처럼 할 수 있는 방법이 있나요 ?

동적쿼리는 쓰기가 좀 ㅡㅡ;;;

CASE가 저것만 되면 최선일텐데요...

by 마농 [2009.10.22 07:56:37]
case나 decode와 크게 차이나는것처럼 생각하시는데 둘 다 거기서 거기에요.
문법적으로 사용방법을 제대로 숙지하지 못하셔서 생긴 오해인것 같네요.
단지 복잡한 조건의 경우에는 decode는 여러번 중첩하고 다른 함수 섞어써야만 구현되지만 case는 한번만 써도 되기 때문에 case 쓰라는 것일 뿐이라고 생각되네요.
단순 이퀄 조건인 경우엔 별반 차이 없습니다.

ORDER BY DECODE(vchOrderBy,'EndDate',EndDate) DESC
, DECODE(vchOrderBy,'Title' ,Title) ASC

ORDER BY CASE WHEN vchOrderBy = 'EndDate' THEN EndDate END DESC
, CASE WHEN vchOrderBy = 'Title' THEN Title END ASC

by AquaMacker [2009.10.22 20:20:14]
헉 그러네요;;;
CASE도 되네요...신기신기 ㅋ
CASE를 워낙 안써봐서 ㅋㅋ

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