PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres :Trier par colonne de chaîne avec des valeurs connues

1.Si vous avez juste besoin d'un sql en postgres, le voici :

select * from events
order by (case state 
          when 'scheduled' then 1
          when 'notified' then 2
          when 'invited' then 3
          when 'started' then 4
          when 'ended' then 5 
          end)    

vous pouvez changer l'ordre des états en sql, pas besoin de changer le code ruby, jouez du violon sql :http://sqlfiddle.com/#!12/976e9/3 .

2.Dans la suggestion de mu, vous pouvez utiliser un type enum, c'est plus efficace, si vous avez besoin de changer l'ordre, vous pouvez recréer l'énumération. voir ce violon sql :http://sqlfiddle.com/#!12/f6f3d/2

CREATE TYPE states AS ENUM ('invited', 'scheduled', 'notified', 'started', 'ended');
create table events(
  name varchar(100),
  state states
);

select * from events order by state;

3.En pur rubis, vous pouvez définir un hachage :

test_hash = {'scheduled'=>1, 'notified'=>2, 'invited'=>3, 'started'=>4, 'ended'=>5}
Events.all.sort! {|x, y| test_hash[x.state] <=> test_hash[y.state]}

4.Mais à mon avis, vous devriez ajouter une table nommée "states", avec les colonnes "name" et "sequence", et spécifier l'ordre dans "sequence". Joignez-vous alors aux "événements" et aux "états". Lorsque vous modifiez la commande, vous n'avez pas besoin de modifier le code.