Случай Oracle 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
С точки зрения производительности, я думаю, это не должно быть проблемой, но это выглядит как спагетти...Есть ли способ поставить 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
вам не нужно самосоединение (внешний 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