문제
내 데이터를 일부 열로 정렬해야하므로 일부 특정 값이 먼저 나타납니다. 그러니 이와 같은 쿼리의 경우 ...
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-when
로 where
절?
해결책
당신은 쿼리하고 있습니다 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
제휴하지 않습니다 StackOverflow