234 votes

Trier PAR la liste des valeurs de l'IN

J'ai une requête SQL simple dans PostgreSQL 8.3 qui récupère un tas de commentaires. Je fournis une liste triée de valeurs à la construction IN dans la clause WHERE:

SÉLECTIONNER * FROM comments WHERE (comments.id IN (1,3,2,4));

Cela renvoie des commentaires dans un ordre arbitraire qui, dans mon cas, sont des identifiants comme 1,2,3,4.

Je veux que les lignes résultantes soient triées comme la liste dans la construction IN: (1,3,2,4).
Comment y parvenir?

31voto

Carl Mercier Points 551

Une autre façon de le faire dans Postgres serait d'utiliser la fonction idx.

SELECT *
FROM comments
ORDER BY idx(array[1,3,2,4], comments.id)

N'oubliez pas de créer d'abord la fonction idx, comme décrit ici : http://wiki.postgresql.org/wiki/Array_Index

31voto

Clodoaldo Neto Points 26723

En Postgresql :

select *
from comments
where id in (1,3,2,4)
order by position(id::text in '1,3,2,4')

2voto

Parslip Points 19

En recherchant un peu plus, j'ai trouvé cette solution :

SELECT * FROM "comments" WHERE ("comments"."id" IN (1,3,2,4)) 
ORDER BY CASE "comments"."id"
WHEN 1 THEN 1
WHEN 3 THEN 2
WHEN 2 THEN 3
WHEN 4 THEN 4
END

Cependant, cela semble plutôt verbeux et pourrait poser des problèmes de performances avec de grands ensembles de données. Quelqu'un peut-il commenter ces problèmes ?

2voto

Paul Sonier Points 25528

Pour ce faire, je pense que vous devriez probablement avoir une table "ORDER" supplémentaire qui définit la correspondance des IDs à l'ordre (effectivement ce que votre réponse à votre propre question a dit), que vous pouvez ensuite utiliser comme une colonne supplémentaire dans votre sélection sur laquelle vous pouvez ensuite trier.

De cette façon, vous décrivez explicitement l'ordre que vous désirez dans la base de données, là où il devrait être.

2voto

Michael Buen Points 20453

Sans SÉQUENCE, fonctionne uniquement sur 8.4:

select * from comments c
join 
(
    select id, row_number() over() as id_sorter  
    from (select unnest(ARRAY[1,3,2,4]) as id) as y
) x on x.id = c.id
order by x.id_sorter

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