Oracle SQL Case quando pedindo
Pergunta
Eu tenho que resolver meus dados por alguma coluna, de modo que algum valor específico apareça primeiro. Então, para uma consulta como esta ...
SELECT rtrim(taskid) into v_taskid FROM tasks
where
/* some where clausers */
and rownum = 1
... eu baseei isso em case when
, mas o que me incomoda é três selecionamentos aninhados que tenho agora:
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
Em termos de desempenho, acho que não deveria haver um problema, mas parece uma espécie de espaguete ... existe alguma maneira de colocar case-when
no where
cláusula?
Solução
Você está consultando o tasks
Tabela duas vezes. Isso não é necessário e fará com que sua consulta funcione lentamente. Sua consulta pode ser combinada em uma consulta simples como assim:
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;
Em seguida, basta recuperar a primeira linha ou adicionar a parte Rownum em uma consulta externa.
Outras dicas
do utilizador 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;
Se taskid
é a chave principal de tasks
Você não precisa da auto-joia (seleção externa):
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