2014-11-25 5 views
0

테이블 Local_LsIr_Temp에서 일부 데이터를 선택하려고했습니다.SQL에서 ORDER BY를 수행 할 때 빈 문자열 앞에 NULL 값이 표시됨

dir_email
  1. dir_tele이 존재 : 나는 그것이로 주문해야하는 방식으로 데이터가 필요합니다.
  2. 적어도 dir_email가 존재
  3. 적어도 dir_tele가 존재 (dir_telenull 또는 empty 일 수있다) I는 상기 쿼리를 작성
SELECT ROW_NUMBER() OVER 
(PARTITION BY inst_iconum ORDER BY 
    CASE WHEN (dir_email = '' OR dir_email IS NULL) THEN 1 ELSE 0 END, dir_email, 
    CASE WHEN (dir_tele = '' OR dir_tele IS NULL) THEN 1 ELSE 0 END, dir_tele 
) rn, 
* 
FROM Local_LsIr_Temp 

(dir_emailnull 또는 empty 될 수 있음), 그 결과는 예상대로 오지 않는다.

아래 첨부 된 샘플 결과는 파란색으로 표시된 행이 모두 null 값을 갖는 행 위에 와야합니다.

enter image description here

이 문제에 대한 SQL 바이올린을 찾아주세요. SQL Fiddle

+2

, 결과 행이 반환됩니다 주문 어떤 보장도 없다 - 순서를 보장 할 수있는 * 유일한 * 일 결과 세트의 행 수는 가장 바깥 쪽 쿼리에 첨부 된'ORDER BY' 절입니다. 현재로서는 아무 것도 없습니다. –

답변

2

케이스 문을 먼저 지정해야합니다. 당신이 ORDER BY 절을 다시 작성하여 원하는 결과를 얻을 수 있다고 말했다 갖는 순간

ORDER BY CASE 
    WHEN dir_email <> '' AND dir_tele <> '' THEN 1 -- Both dir_email and dir_tele are present 
    WHEN dir_email <> ''     THEN 2 -- At least dir_email is present 
    WHEN dir_tele <> ''     THEN 3 -- At least dir_tele is present 
    ELSE           4 
END --, additional columns here 
+0

감사합니다. – Sarin

0

문제는 주문 순서가 잘못되었습니다. dir_email이 비어 있지 않으면 dir_tele이 기본적으로 무시됩니다.

이 시도 :

... 
order by 
    case when (dir_email = '' or dir_email is null) then 1 else 0 end, 
    case when (dir_tele = '' or dir_tele is null) then 1 else 0 end, 
    dir_enail, 
    dir_tele