2010-03-11 4 views
2

Je dois trier mes données par une colonne, de sorte qu'une valeur spécifique apparaisse en premier. Donc, pour une requête comme ça ...Oracle SQL cas de la commande

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 j'ai 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 ça ne devrait pas poser de problème, mais ça ressemble à un spaghetti ... Y a-t-il un moyen de mettre case-when dans la clause where?

Répondre

3

Vous interrogez le double tableau tasks. Ce n'est pas nécessaire et fera fonctionner votre requête 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; 

Ensuite, soit simplement récupérer la première ligne ou ajouter la partie rownum dans une requête externe.

1

utilisateur 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; 
+0

Une requête analytique n'est pas nécessaire ici et aura un impact sur les performances. –

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