Autor wpisu: batman, dodany: 31.05.2010 18:00, tagi: sql
Zdarza się czasami, że musimy posortować dane inaczej niż zgodnie z kolejnością alfabetyczną. Załóżmy taką sytuację. Mamy tabelę zawierającą statusy produktów. Tak się zdarzyło, że zostały one zapisane w postaci tekstowej. Poniżej schemat tabeli
CREATE TABLE produkty ( id serial NOT NULL, nazwa character varying(500), status character varying(50) ) WITH ( OIDS=TRUE );
oraz przykładowe dane
INSERT INTO produkty (id, nazwa, status) VALUES (1, 'produkt 1', 'magazyn 1'); INSERT INTO produkty (id, nazwa, status) VALUES (2, 'inny produkt', 'magazyn 2'); INSERT INTO produkty (id, nazwa, status) VALUES (3, 'super produkt', 'brak'); INSERT INTO produkty (id, nazwa, status) VALUES (4, 'produkt 2', 'magazyn 1'); INSERT INTO produkty (id, nazwa, status) VALUES (5, 'inny super produkt', 'dostawa'); INSERT INTO produkty (id, nazwa, status) VALUES (6, 'produkt 3', 'magazyn 2');
Jeśli chcielibyśmy posortować te dane w taki sposób, że najpierw wyświetlają się produkty znajdujące się w dowolnym magazynie, następnie produkty, których nie ma na składzie, a na końcu wszystkie, które są w dostawie, mielibyśmy spory problem. Na szczęście w postgresie jest takie coś jak wyrażenie warunkowe CASE, które idealnie nada się do naszego problemu. Wprawdzie zapytanie się nieco rozrośnie, zwłaszcza jeśli mamy dużo warunków do sprawdzenia, ale pożądany efekt zostanie uzyskany bez konieczności zaprzęgania do pracy dodatkowego języka.
select * from produkty order by case when status = 'magazyn 1' then 1 when status = 'magazyn 2' then 2 when status = 'brak' then 3 when status = 'dostawa' then 4 else 5 end
Powyższy sposób sprawdzi się również w przypadku sortowania danych numerycznych. Uzyskanie kolejności 6, 2, 3, pozostałe liczby malejąco, jest równie prosty. Dla powyższych danych będzie to wyglądało następująco
select * from produkty order by case when id = 6 then 1 when id = 2 then 2 when id = 3 then 3 else 4 end , id desc
W ten oto prosty sposób, uzyskaliśmy niestandardowe sortowanie naszych danych.