Ok j'ai une table avec une clé indexée et un champ non indexé. Je dois trouver tous les enregistrements avec une certaine valeur et renvoyer la ligne. Je voudrais savoir si je peux commander par valeurs multiples.
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 soient classés comme ceci, where ORDER BY x_field = 'f', 'p', 'i', 'a'
SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'
Les résultats seraient donc:
id x_field
-- -----
127 f
133 p
134 p
135 i
123 a
124 a
125 a
129 a
La syntaxe est valide mais lorsque j'exécute la requête, elle ne renvoie aucun résultat, même si je la limite à 1 enregistrement. Y a-t-il une autre façon de procéder?
Considérez le champ x comme des résultats de test et j'ai besoin de valider tous les enregistrements qui correspondent à la condition. Je voulais ordonner les résultats du test par valeurs échouées, valeurs passées. Je pourrais donc valider les valeurs ayant échoué en premier, puis les valeurs passées en utilisant ORDER BY.
Ce que je ne peux pas faire:
- GROUP BY, car je dois renvoyer les valeurs d'enregistrement spécifiques
- WHERE x_field IN ('f', 'p', 'i', 'a'), j'ai besoin de toutes les valeurs car j'essaie d'utiliser une requête pour plusieurs tests de validation. Et les valeurs x_field ne sont pas dans l'ordre DESC / ASC
Après avoir écrit cette question, je commence à penser que je dois repenser cela, LOL!
la source
Réponses:
la source
Vous pouvez utiliser une jointure à gauche avec "VALUES ('f', 1), ('p', 2), ('a', 3), ('i', 4)" et utiliser la deuxième colonne dans votre commande -par expression. Postgres utilisera un Hash Join qui sera bien 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.
la source
Essayer:
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 non comparés à quoi que ce soit dans le jeu de données.
la source
Utilisez un
case
commutateur pour traduire les codes en nombres qui peuvent être triés:la source
J'ai trouvé une solution beaucoup plus propre pour cela:
Remarque: array_position nécessite Postgres v9.5 ou supérieur.
la source
array_position(ARRAY[1, 0]::integer[], x_field)
Les suggestions
CASE
etORDER BY
devraient toutes fonctionner, mais je vais suggérer un cheval d'une couleur différente. En supposant qu'il n'existe qu'un nombre raisonnable de valeurs pourx_field
et que vous savez déjà ce qu'elles sont, créez un type énuméré avec F, P, A et I comme valeurs (plus toutes les autres valeurs possibles applicables). Les énumérations seront triées dans l'ordre implicite de leurCREATE
instruction. En outre, vous pouvez utiliser des noms de valeur signifiants - votre application réelle le fait probablement et vous venez de les masquer pour des raisons de confidentialité - sans gaspiller d'espace, car seule la position ordinale est stockée.la source
Vous pouvez trier selon une colonne sélectionnée ou d'autres expressions.
Voici un exemple, comment classer par le résultat d'une instruction de cas:
Le résultat sera une liste commençant par les lignes «IsGen = 0», suivies par les lignes «IsGen = 1» et toutes les autres lignes à la fin.
Vous pouvez ajouter plus de paramètres de commande à la fin:
la source
Pour quelqu'un qui est nouveau ORDER BY avec CASE, cela peut être utile
la source
vous pouvez utiliser la position (texte dans le texte) dans l'ordre pour ordonner la séquence
la source