PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres:Ordenar por coluna de string com valores conhecidos


1.Se você só precisa de um sql no postgres, aqui está:
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)    

você pode alterar a ordem dos estados no sql, não precisa alterar o código ruby, toque o violino sql:http://sqlfiddle.com/#!12/976e9/3 .

2.Na sugestão de mu, você pode usar um tipo enum, é mais eficiente, se precisar alterar a ordem, você pode recriar o enum. veja este 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.De forma pura rubi, você pode definir um 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.Mas na minha opinião, você deve adicionar uma tabela chamada "states", com as colunas "name" e "sequence", e especificar a ordem em "sequence". Junte-se aos "eventos" e "estados" então. Quando você altera o pedido, não é necessário alterar o código.