PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres:Ordina per colonna stringa con valori noti

1.Se hai solo bisogno di un sql in postgres, eccolo qui:

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)    

puoi cambiare l'ordine degli stati in sql, non c'è bisogno di cambiare il codice ruby, suonare il violino sql:http://sqlfiddle.com/#!12/976e9/3 .

2. Nel suggerimento di mu, puoi usare un tipo enum, è più efficiente, se hai bisogno di cambiare l'ordine, puoi ricreare l'enumerazione. guarda questo violino 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.In puro rubino, puoi definire un hash:

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.Ma a mio parere, dovresti aggiungere una tabella denominata "stati", con le colonne "nome" e "sequenza", e specificare l'ordine in "sequenza". Unisciti agli "eventi" e agli "stati" allora. Quando modifichi l'ordine, non è necessario modificare il codice.