PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres:Sortieren nach Zeichenfolgenspalte mit bekannten Werten

1.Wenn Sie nur ein SQL in Postgres benötigen, hier ist es:

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)    

Sie können die Reihenfolge der Zustände in SQL ändern, ohne den Ruby-Code ändern zu müssen, spielen Sie die SQL-Geige:http://sqlfiddle.com/#!12/976e9/3 .

2.In Mu's Vorschlag können Sie einen Aufzählungstyp verwenden, es ist effizienter, wenn Sie die Reihenfolge ändern müssen, können Sie die Aufzählung neu erstellen. siehe diese SQL-Geige: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. Auf reine Ruby-Weise können Sie einen Hash definieren:

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. Aber meiner Meinung nach sollten Sie eine Tabelle namens "states" mit den Spalten "name" und "sequence" hinzufügen und die Reihenfolge in "sequence" angeben. Treten Sie dann den "Ereignissen" und "Staaten" bei. Wenn Sie die Bestellung ändern, müssen Sie den Code nicht ändern.