Oracle SQL caso cuando, por orden
Pregunta
Tengo que ordenar mis datos por alguna columna, de modo que algún valor específico aparece por primera vez. Así que para una consulta como esta ...
SELECT rtrim(taskid) into v_taskid FROM tasks
where
/* some where clausers */
and rownum = 1
... He basado en case when
, pero lo que me molesta es tres anidados selecciona tengo ahora:
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
En cuanto al rendimiento, creo que no debería ser un problema, pero parece una especie de espaguetis ... ¿Hay alguna manera de poner case-when
en la cláusula where
?
Solución
Se está consultando la tabla tasks
dos veces. Esto no es necesario, y hará que su consulta funcione con lentitud. Su consulta se pueden combinar en una simple consulta de este 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;
Entonces, o simplemente recuperar la primera fila o añadir la parte rownum en una consulta externa.
Otros consejos
row_number() over (...)
usuario
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
es la clave primaria de tasks
que no es necesario el auto-join (SELECT 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