sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:Ordenar por columna de cadena con valores conocidos

1.Si solo necesita un sql en postgres, aquí 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)    

puede cambiar el orden de los estados en sql, no es necesario cambiar el código ruby, toque el violín sql:http://sqlfiddle.com/#!12/976e9/3 .

2. En la sugerencia de mu, puede usar un tipo de enumeración, es más eficiente, si necesita cambiar el orden, puede volver a crear la enumeración. vea este violín 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 puramente rubí, puedes definir 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.Pero en mi opinión, debe agregar una tabla llamada "estados", con columnas "nombre" y "secuencia", y especificar el orden en "secuencia". Únase a los "eventos" y "estados" entonces. Cuando cambia el pedido, no necesita cambiar el código.