2009-09-09 17 views
6

Mam prostą tabelę, coś w stylu: int id, date created_at, date updated_at. Chciałbym zamówić wiersze, aby wszystkie wiersze o numerze updated_at zostały posortowane według tego, a wszystkie, które nie zostaną posortowane przez created_at. Problem polega na tym, że coś takiego:Zamawianie przez wiele pól w SQLite

SELECT * FROM table ORDER BY updated_at, created_at 

nie działa. Sprawdzam klauzule niestandardowych zamówień, takie jak:

ORDER BY CASE WHERE updated_at ISNULL <do something> END, created_at 

, ale nie można uzyskać niczego do pracy. Pomoc?

EDIT: Powinienem zaznaczyć, że chcę pola updated_at uporządkować przed polami created_at. Tak więc, jeśli dane wygląda następująco:

id created_at updated_at 
-- ---------- ---------- 
1 2009-01-08 null 
2 2009-09-08 null 
3 2009-07-02 null 
4 2009-09-05 2009-09-06 
5 2009-04-01 null 
6 2009-09-07 2009-09-08 

bym chciał rezultaty takie jak:

id created_at updated_at 
-- ---------- ---------- 
6 2009-09-07 2009-09-08 
4 2009-09-05 2009-09-06 
2 2009-09-08 null 
3 2009-07-02 null 
5 2009-04-01 null 
1 2009-01-08 null 
+0

Zaktualizowałem swoją odpowiedź na podstawie Twojej aktualizacji. –

Odpowiedz

17

wygląda szukasz:

ORDER BY COALESCE(updated_at, created_at) 

na the docs, coalesce zwrotów

Kopią pierwszego n Argument on-NULL. Jeśli wszystkie argumenty są równe NULL, zwracana jest wartość NULL: . Musi być co najmniej 2 argumentów.

Edit: podany edit PO, on może zamiast tego chcesz:

ORDER BY COALESCE(updated_at, '1929-9-9') DESC, created_at DESC 

lub podobnych sztuczek dla malejąco Kolejność; czy może

ORDER BY MAX(COALESCE(updated_at, '1929-9-9'), created_at) DESC 

, że to niemożliwe, aby powiedzieć dokładnie to, co PO chce z jednej i bardzo osobliwy przykład, ale wariant na niektóre z tych metod powinno rozwiązać swój rzeczywisty problem, cokolwiek, że problem może być w rzeczywistości w specyficzny, precyzyjny i kompletny detal.

3

IFNULL patrz here

W tym przypadku byłoby użyć coś takiego:

IFNULL (updated_at, '1-sty-2100'), created_at

wszystkie kolumny bez pola updated_at otrzyma domyślną kolejność sortowania, a następnie posortuje według created_at. Wartość 1-jan-2100 zapewnia pojawienie się na końcu listy. Zmień to na 1900, jeśli chcesz je najpierw.

+0

Dzięki, to było bardzo pomocne, ale nie było to dokładnie to, czego szukałem, ponieważ źle sformułowałem moje pytanie. Edytowane. –

0

Wiem, że to nie odpowiada dokładnie na twoje pytanie, ale jest to alternatywne rozwiązanie.

Jeśli było ustawić pole updated_at się tak samo jak created_at na tworzenie, byś zawsze mają wartość dla updated_at i może zawsze tylko sortować według pola updated_at.W przypadku niewielkiej ilości duplikacji upraszczasz swój kod, swoje życie i efektywność kwerend sql.