Oracle SQL Fall, wenn für die Bestellung
Frage
Ich habe durch eine Spalte meiner Daten sortieren, so dass einiger spezifischer Wert wird zuerst angezeigt. Also für eine Abfrage wie folgt ...
SELECT rtrim(taskid) into v_taskid FROM tasks
where
/* some where clausers */
and rownum = 1
... Ich habe es auf case when
basiert, aber was mich stört, ist drei verschachtelte wählt Ich habe jetzt:
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
Performance-weise ich denke, es ist kein Problem sein sollte, aber es sieht ein bisschen eine Spaghetti ... Gibt es eine Möglichkeit case-when
in die where
Klausel zu setzen?
Lösung
Sie sind die Abfrage der tasks
Tabelle zweimal. Dies ist nicht erforderlich und wird Ihre Abfrage ausführen langsam machen. Ihre Abfrage kann in eine einfache Abfrage wie so kombiniert werden:
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;
Dann entweder abrufen nur die erste Zeile oder den rownum Teil in einer äußeren Abfrage hinzuzufügen.
Andere Tipps
Benutzer 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;
Wenn taskid
der Primärschlüssel tasks
ist, dass Sie nicht brauchen, die Self-Join (äußere 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