caso Oracle SQL quando per l'ordinazione
Domanda
devo risolvere i miei dati da parte di alcuni della colonna, in modo tale che un valore specifico viene visualizzato prima. Così, per una query come questa ...
SELECT rtrim(taskid) into v_taskid FROM tasks
where
/* some where clausers */
and rownum = 1
... Ho basato su case when
, ma quello che mi preoccupa è tre seleziona nidificati ho ora:
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-saggio penso che non dovrebbe essere un problema, ma sembra una specie di spaghetti di ... C'è un modo per mettere in case-when
la clausola where
?
Soluzione
Si sta interrogando la tabella tasks
due volte. Questo non è necessario e renderà la query eseguita lentamente. Vostri criteri possono essere combinati in una semplice query in questo modo:
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;
Allora o semplicemente recuperare la prima riga o aggiungere la parte rownum in una query esterna.
Altri suggerimenti
row_number() over (...)
utente
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
è la chiave primaria della tasks
non è necessario l'auto-join (esterno SELEZIONA):
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