Oracle SQL cas lorsque pour la commande
Question
Je dois trier mes données par une colonne, de sorte que une valeur spécifique apparaît en premier. Donc, pour une requête comme ça ...
SELECT rtrim(taskid) into v_taskid FROM tasks
where
/* some where clausers */
and rownum = 1
... Je l'ai basé sur case when
, mais ce qui me dérange est de trois sélections imbriquées je maintenant:
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
Je pense que la performance sage, il ne devrait pas être un problème, mais il semble une sorte de spaghettis ... Est-il possible de mettre case-when
dans la clause where
?
La solution
Vous interrogez la table tasks
deux fois. Ce n'est pas nécessaire et fera de votre requête exécutée lentement. Votre requête peut être combiné dans une requête simple comme ceci:
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;
Alors soit juste récupérer la première ligne ou ajouter la partie rownum dans une requête externe.
Autres conseils
row_number() over (...)
utilisateur
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;
Si taskid
est la clé primaire de tasks
vous n'avez pas besoin de l'auto-jointure (SELECT externe):
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