2010-03-11 3 views
2

몇 가지 특정 값을 먼저 표시하도록 데이터를 정렬해야합니다.오라클 SQL 케이스 주문시

SELECT rtrim(taskid) into v_taskid FROM tasks 
    where 
    /* some where clausers */ 
    and rownum = 1 

... 내가 case when에 기반,하지만 날 귀찮게하는 세 개의 중첩 된 선택이다가 ... 이런 쿼리에 대한 그래서 나는 지금이 :

SELECT rtrim(taskid) into v_taskid FROM tasks where taskid in (
    select taskid from (
     select taskid, 
     case when taskuser like '%myuser%' 
     then 0 
      else 100 
     end as ordervalue 
     FROM tasks 
     where  
      /* some where clausers */ 
     order by ordervalue 
     ) 
    )  
    and rownum = 1 

성능이 많다는 나는 생각한다 그것은 문제가 안된다,하지만 그것은 스파게티의 일종 보인다 ... where 절에 case-when 넣어 어떤 방법이 있습니까?

답변

3

당신은 tasks 테이블을 두 번 쿼리하는가. 이것은 필요하지 않으며 쿼리를 느리게 실행합니다. 귀하의 질의과 같이 간단한 쿼리로 결합 할 수 있습니다

SELECT rtrim(taskid) into v_taskid 
FROM (
    SELECT taskid 
    FROM tasks 
    WHERE /* some where clauses */ 
    ORDER BY case when taskuser like '%myuser%' then 0 else 100 end 
) 
WHERE rownum = 1; 

을 다음 중 단지 첫 번째 행을 검색하거나 외부 쿼리에서 ROWNUM 부분을 추가합니다.

1

사용자 row_number() over (...)

select 
    taskid 
from (
    select 
    taskid, 
    row_number() over (
     order by 
     case when taskuser like '%myuser%' then 0 
              else 100 
     end 
    ) r 
    from 
    tasks 
    WHERE 
    /* some where clausers */ 
) 
where 
    r = 1; 
+0

여기서는 분석 쿼리가 필요하지 않으며 성능에 영향을 미칩니다. –

1

taskid 당신이이 (외부 SELECT)을 자체 조인이 필요하지 않습니다 tasks의 기본 키 인 경우 :

SELECT rtrim(taskid) 
    FROM (SELECT taskid 
      FROM tasks 
      /* where clause */ 
      ORDER BY CASE 
         WHEN taskuser LIKE '%myuser%' THEN 
         0 
         ELSE 
         100 
        END) 
WHERE ROWNUM = 1