sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres:Ordna efter strängkolumn med kända värden

1.Om du bara behöver en sql i postgres, här är den:

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)    

du kan ändra ordningen på tillstånden i sql, du behöver inte ändra rubykoden, spela sql-fiolen:http://sqlfiddle.com/#!12/976e9/3 .

2.I mu:s förslag kan du använda en enum-typ, det är mer effektivt, om du behöver ändra ordningen kan du återskapa enumen. se denna sql-fiol: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.På ett rent rubinsätt kan du definiera en 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.Men enligt min mening bör du lägga till en tabell med namnet "stater", med kolumner "namn" och "sekvens", och ange ordningen i "sekvens". Gå med i "events" och "stater" då. När du ändrar beställningen behöver du inte ändra koden.




  1. Vad är det bästa sättet att synkronisera data mellan MS Access och MySQL?

  2. Hur man lagrar flera alternativ valda av användaren i en tabell

  3. Utmaningar med att skala Moodle MySQL-databasen

  4. Hur tar jag bort emoji-tecken från en sträng?