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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top