144 votes

sql ORDER BY plusieurs valeurs dans un ordre spécifique?

Ok j'ai une table avec une clé indexées et non indexées champ. J'ai besoin de trouver tous les enregistrements ayant une certaine valeur et le retour à la ligne. Je voudrais savoir si je peux commander par multiples valeurs.

Exemple:

id     x_field
--     -----
123    a
124    a
125    a
126    b
127    f
128    b
129    a
130    x
131    x
132    b
133    p
134    p
135    i

pseudo: souhaite que les résultats à être commandés, comme cela, où l'ORDRE PAR x_field = 'f', 'p', 'i', 'a'

SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'

De sorte que les résultats seraient les suivants:

id     x_field
--     -----
127    f
133    p
134    p
135    i
123    a
124    a
125    a
129    a

La syntaxe est valide, mais quand j'exécute la requête qu'il ne retourne aucun résultat, même si je me limite à 1 record. Est-il une autre façon d'aller à ce sujet?

Pensez à la x_field que les résultats des tests et j'ai besoin de valider tous les documents qui relèvent de l'état. Je veux les résultats du test par l'échec de valeurs, les valeurs passées. Afin que je puisse valider l'échec des valeurs d'abord, puis les valeurs passées à l'aide de la COMMANDE PAR.

Ce que je ne peux pas faire:

  • GROUP BY, car j'ai besoin de retourner le dossier spécifique de valeurs
  • OÙ x_field DANS('f', 'p', 'i', 'a'), j'ai besoin de toutes les valeurs que j'essaie d'utiliser une requête pour plusieurs tests de validation. Et x_field les valeurs ne sont pas dans la DESC/ASC ordre

Après l'écriture de cette question, je commence à croire que j'ai besoin de repenser ce, LOL!

246voto

gbn Points 197263
...
WHERE
   x_field IN ('f', 'p', 'i', 'a') ...
ORDER BY
   CASE x_field
      WHEN 'f' THEN 1
      WHEN 'p' THEN 2
      WHEN 'i' THEN 3
      WHEN 'a' THEN 4
      ELSE 5 --needed only is no IN clause above. eg when = 'b'
   END, id

42voto

Marc B Points 195501

Essayer:

 ORDER BY x_field='F', x_field='P', x_field='A', x_field='I'
 

Vous étiez sur la bonne voie, mais en mettant x_field uniquement sur la valeur F, les 3 autres ont été traités comme des constantes et n'ont été comparés à rien dans l'ensemble de données.

35voto

peufeu Points 4758

Vous pouvez utiliser une jointure gauche avec un "VALEURS ('f', 1), ('p', 2), ('a', 3), ('i', 4)" et utiliser la deuxième colonne de votre commande -par expression. Postgres utilisera une Hash Join qui sera beaucoup plus rapide qu'un énorme CASE si vous avez beaucoup de valeurs. Et il est plus facile de générer automatiquement.

Si ces informations de commande sont fixes, elles doivent avoir leur propre table.

19voto

Guffa Points 308133

Utilisez un commutateur case pour traduire les codes en nombres pouvant être triés:

 ORDER BY
  case x_field
  when 'f' then 1
  when 'p' then 2
  when 'i' then 3
  when 'a' then 4
  else 5
  end
 

7voto

Andrew Lazarus Points 4364

L' CASE et ORDER BY suggestions qui devraient tous fonctionner, mais je vais suggérer un cheval d'une couleur différente. En supposant qu'il y a seulement un nombre raisonnable de valeurs pour x_field et vous savez déjà ce qu'ils sont, créer un type énuméré avec F, P, A, et moi, comme les valeurs (en plus de toutes les autres valeurs possibles s'appliquent). Les Enums va trier dans l'ordre implicite de par leur CREATE déclaration. Aussi, vous pouvez utiliser meaninful noms de valeur—votre application n'est probablement et vous avez juste masqué eux à des fins de confidentialité—sans espace perdu, puisque seule la position ordinale est stocké.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X