2016-05-04 6 views
0

J'essaie de réécrire certaines anciennes requêtes SQL qui semblent particulièrement horribles. Je me demande s'il existe un moyen plus efficace de hiérarchiser les valeurs dans une instruction where pour l'ordre de priorité. Fondamentalement, la table contient plusieurs enregistrements email_code par utilisateur, mais je veux établir des priorités en fonction des enregistrements préférés. Dans ce cas, si le email_code est WORK, il doit être sélectionné. Mais s'il n'y a pas d'enregistrement WORK, HOME doit être sélectionné, et ainsi de suite. Voici un exemple de ce que je travaille avec. Il doit y avoir une façon plus gracieuse de le faire ...?Sélection Oracle basée sur la priorité

select 
    * 
from 
    email m 
where 
    status_ind='A' 
    and decode(email_code, 'WORK',1, 
          'HOME',2, 
          'ALT1',3, 
          'ALT2',4,5) = (select 
              min(decode(email_code, 'WORK',1, 
                   'HOME',2, 
                   'ALT1',3, 
                   'ALT2',4,5)) 
             from 
              email 
             where 
              email_uid = m.email_uid 
              and status_ind='A'); 
+0

Parlez-vous de COALESCE? https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm – Danilo

+0

Je ne pense pas que COALESCE fonctionne dans cette situation. Dans certains cas, un enregistrement peut avoir tous les 4 de ces codes. C'est plus sur l'ordre de préséance. – oljones

Répondre

1

Essayez:

SELECT * FROM (
    SELECT e.*, 
      dense_rank() over (PARTITION BY user_id 
      ORDER BY CASE email_code 
       WHEN 'WORK' THEN 1 
       WHEN 'HOME' THEN 2 
       WHEN 'ALT1' THEN 3 
       WHEN 'ALT2' THEN 4 
       ELSE 5 
      END) As priority 
    FROM emails e 
    WHERE status_ind='A' 
) 
WHERE priority = 1 
+0

Cela a fonctionné le mieux pour ma situation. Merci! – oljones

0

Hélas je n'avais pas Oracle ici, mais je pense que vous pouvez utiliser quelque chose comme ça

select * from (
    select *,min(decode(email_code, 'WORK',1, 
     'HOME',2,'ALT1',3,'ALT2',4,5)) mincode 
     over(partition by (email_uid)) 
    where status_ind='A' 
) where email_code=mincode 
0

Tout d'abord, il est préférable de créer une recherche table pour contenir les types d'e-mail et leurs priorités. Et puis vous pouvez rejoindre cette table de recherche avec votre table de courrier. Enfin, vous pouvez utiliser l'une des fonctions analytiques d'Oracle (row_number, rank, dense_rank, etc.) pour obtenir la plus haute priorité.