문제

내 데이터를 일부 열로 정렬해야하므로 일부 특정 값이 먼저 나타납니다. 그러니 이와 같은 쿼리의 경우 ...

  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

공연 측면 나는 그것이 문제가되지 않아야한다고 생각하지만, 그것은 일종의 스파게티처럼 보입니다 ... 어떤 방법이 있습니까? case-whenwhere 절?

도움이 되었습니까?

해결책

당신은 쿼리하고 있습니다 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 부분을 추가하십시오.

다른 팁

사용자 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;

만약에 taskid 기본 키입니다 tasks 자체 합의가 필요하지 않습니다 (OUTER SELECT) :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top