Sortowanie po NULL 2008-08-12
Dla kuzyna przygotowuje stronę, która poświęcona jest piłce nożnej. Mamy tam między innymi tabele z punktami, przy czym na początku jest ona pusta i uzupełnia się dopiero przy pierwszy meczu. W tym miejscu pojawił się problem gdyż po uzupełnieniu kilku wyników na samej górze znajdywały się drużyny, które nie rozegrały żadnego spotkania, czyli miały wartość punktów równą NULL.
Cała sytuacja była spowodowana domyślnym ustawieniem w PostgreSQL gdzie wartości NULL są na końcu, a w tym przypadku użycie operatora DESC przerzuca je na sam początek. Poszukałem trochę w internecie i znalazłem rozwiązanie. Po operatorze ASC lub DESC można dać NULLS FIRST lub NULLS LAST. Wszystko pięknie i ładnie, ale działa to dopiero od wersji 8.3, a na serwerach jeszcze tej wersji przeważnie nie ma.
Uzupełnienie:
w komentarzach @Ejdzej rozwiązał mój problem. Należało użyć konstrukcji ORDER BY nazwa_kolumny IS NOT NULL DESC, nazwa_kolumny DESC.
Słowa kluczowe: PostgreSQL, bazy danych, sortowanie, sql, artykuł, blog
a nie mogłeś po prostu zera użyć?
w T-SQL ja do takiego sortowania coalesce używam zamieniając NULL na 0
@Maciek: robię złączenie LEFT JOIN listy drużyn oraz tabeli punktowej co w rezultacie daje wartość null w kolumnie punktów
Sposób 1: COALESCE
SELECT .... COALESCE(punkty, 0) as punkty
ORDER BY COALESCE(punkty, 0)
Zamiast pisać ciągle to COALESCE można się posłużyć widokiem.
Sposób 2: sortowanie po wyrażeniu
SELECT...
ORDER BY punkty IS NOT NULL, punkty
Sposób 2 jest oczywiście lepszy, bo można rozróżnić drużynę która nic nie wygrała od tej, która jeszcze nie grała. Ja bym takiego użył nic nie wiedząc o NULLS FIRST :) Chyba powinienem przeczytać znowu dokumentację i wypatrzeć takie ułatwiające życie nowinki.
@Ejdzej: wielkie dzięki, ten drugi sposób to jest to czego potrzebowałem :)
Próbuje to samo zastosować w bazie MySQL i nie bardzo mi to wychodzi :(
A u mnie, na bazie, wychodzi wszystko.