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?
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) ...
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;