web-dev-qa-db-fra.com

Pouvez-vous ajouter une instruction if dans ORDER BY?

J'essaie d'atteindre les objectifs suivants:

J'ai une seule instruction ORDER BY qui peut varier en fonction de la valeur stockée dans la colonne A.

Par exemple:

si le type est membre, trier par nom de famille du membre si le type est groupe, trier par nom de groupe

les deux dans l'ordre croissant.

Ma meilleure supposition pour la déclaration finale serait:

SELECT * 
  FROM table 
 WHERE STATUS = 'Active' 
 ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC

Je sais que c'est incorrect mais je ne trouve pas d'informations ailleurs. Des idées?

35
JM4

Eh bien, vous pouvez utiliser la fonction IF dans MySQL (Notez l'accent mis sur function car il y a aussi une relation indépendante IF ) ...:

ORDER BY IF(TYPE='Member', LNAME, GROUPNAME) ASC

Cependant, dans ce cas, il semble que le meilleur choix (du point de vue de la flexibilité) serait CASE instruction :

ORDER BY 
    CASE `type` 
        WHEN 'Member' THEN LNAME 
        WHEN 'Group' THEN GROUPNAME
        ELSE 1 END 
    ASC

Notez que le bloc entier de CASE à END doit être considéré comme une seule "unité". Le résultat est ce contre quoi vous essayez de trier (d'où la raison pour laquelle le ASC vient après le bloc, plutôt qu'à l'intérieur de celui-ci) ...

62
ircmaxell

Utilisez l'instruction CASE.

Exemple tiré de http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html :

SELECT id, first_name, last_name, birthday
FROM table
ORDER BY
-- numeric columns
CASE _orderby WHEN 'id' THEN id END ASC,
CASE _orderby WHEN 'desc_ id' THEN id END DESC,
-- string columns
CASE _orderby WHEN 'first_name' THEN first_name WHEN 'last_name' THEN last_name END ASC,
CASE _orderby WHEN 'desc_first_name' THEN first_name WHEN 'desc_last_name' THEN last_name END DESC,
-- datetime columns
CASE _orderby WHEN 'birthday' THEN birthday END ASC,
CASE _orderby WHEN 'desc_ birthday' THEN birthday END DESC;
11
Andy