sql >> Database >  >> RDS >> PostgreSQL

Postgres:Sorteer op tekenreekskolom met bekende waarden

1.Als je alleen een sql in postgres nodig hebt, hier is het:

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)    

u kunt de volgorde van de toestanden in sql wijzigen, u hoeft de ruby-code niet te wijzigen, speel de sql-viool:http://sqlfiddle.com/#!12/976e9/3 .

2.In de suggestie van mu kun je een enum-type gebruiken, het is efficiënter, als je de volgorde moet wijzigen, kun je de enum opnieuw maken. zie deze sql viool: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. Op pure robijnrode manier kun je een hash definiëren:

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. Maar naar mijn mening zou je een tabel met de naam "states" moeten toevoegen, met kolommen "name" en "sequence", en de volgorde specificeren in "sequence". Doe dan mee met de "evenementen" en "staten". Wanneer u de bestelling wijzigt, hoeft u de code niet te wijzigen.




  1. Uitvoeringsplan voor SQL Server - wat is het en hoe helpt het bij prestatieproblemen?

  2. Hoe stel je unieke gebruikersnamen voor aan gebruikers in PHP?

  3. Twee tabellen samenvoegen in de JPA-repository

  4. PHP/MySQL - algoritme voor Top Rated