2010-09-10 5 views
4

J'ai un algorithme de priorisation complexe que je veux écrire en SQL pour renvoyer des pages de données prioritaires.Commande complexe dans SQL Query: éventuellement en utilisant CASE WHEN

Certains d'entre eux sont hiérarchisés en fonction de valeurs fixes, d'autres sont classés par valeurs variables. à savoir

// Initial sort on ATTR1 (value1/value2 is higher than value3) 
if ATTR1 = value1 or value2 
    then orderBy creationDate, then modifiedDate, then author 
else if ATTR1 = value3 
    then 
    // if ATTR1 = value3, do secondary sort on ATTR2 (value4 is higher than value5) 
    if ATTR2 = value4 
     then orderBy oldPriority, then modifiedDate, then creationDate, then author 
    if ATTR2 = value5 
     then orderBy creationDate, then modifiedDate 

J'ai eu un oeil à SQL CASE QUAND, mais ne savez pas comment faire ce travail avec le deuxième niveau de comparaison d'attribut.

CASE WHEN est-il un outil approprié pour atteindre cet objectif? Quelqu'un a-t-il des conseils pour gérer les niveaux de complexité supplémentaires?

Merci d'avance!

+0

Je ne suis pas sûr que cela est logique: s'il y a seulement 2 lignes et on a ATTR1 = valeur1 et l'autre a ATTR1 = value3 et ATTR2 = value4, qui devrait être commandé en premier? –

+0

J'ai ajouté quelques commentaires dans ma question originale :) – laura

+0

Excuses, envoyé celui-là trop tôt. Les lignes doivent être priorisées par ATTR1 en premier (dans cet ordre value1, value2, value3) - donc dans votre exemple ATTR1 = value1 viendra en premier. Ensuite, si ATTR1 = valeur 3, passez au tri secondaire – laura

Répondre

4

Quelque chose comme ça devrait le faire:

ORDER BY attr1, 
CASE WHEN ATTR1 IN (value1, value2) 
     THEN TO_CHAR(creationDate,'YYYYMMDDHH24MISS') 
      || to_char(modifiedDate,'YYYYMMDDHH24MISS') || author 
    WHEN ATTR1 = value3 
     THEN attr2 || CASE WHEN ATTR2 = value4 
          THEN to_char(oldPriority,'99999') 
           || to_char(modifiedDate,'YYYYMMDDHH24MISS') 
           || to_char(creationDate,'YYYYMMDDHH24MISS') 
           || author 
          WHEN ATTR2 = value5 
          THEN to_char(creationDate,'YYYYMMDDHH24MISS') 
           || to_char(modifiedDate,'YYYYMMDDHH24MISS') 
          END 
    END 

Je suppose que oldPriority était une colonne numérique, qui peut ne pas être le cas. Le but est de tout convertir en chaînes qui commandent correctement, en utilisant des masques de format appropriés.

+0

Merci d'avoir répondu. Qu'est-ce que le || faire?? – laura

+0

|| est l'opérateur de concaténation de chaîne, c'est-à-dire 'a' || 'b' est 'ab' –

+0

ah, super! Merci beaucoup! – laura

0

faire quelques petites hypothèses, il semble que cela devrait fonctionner:

order by 
    case ATTR1 
     when value1 then 
     1 
     when value2 then 
     2 
     when value3 then 
     3 
    end, 
     when ATTR1 in (value1,value2) 
      or (ATTR1 = value3 and ATTR2 = value5) then 
     creationDate 
     else 
     null 
     end, 
    case 
     when ATTR1 = value3 and ATTR2 = value4 then 
     oldPriority 
     else 
     null 
     end, 
    modifiedDate, 
    case 
     when not (ATTR1 = value3 and ATTR2 = value5) then 
      author 
     else null 
     end 
Questions connexes