2009-08-28 15 views
6

to jest mój kod teraz:Zamówienie przez wartość null, następnie zamówić przez inną zmienną

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY id, number 

ale chcę, żeby wyglądać tak:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY while(number IS NULL), id 

Co chcę zrobić, to mieć wszystko number że są NULL na górze wyników, ale jak tylko number nie jest NULL, sortowanie id

Czy to możliwe?

Używam mysql.

Odpowiedz

19

co o coś takiego:

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY (case when number is null then 0 else 1 end), id 

Jeśli liczba jest NULL, pierwsza kolejność według kryteriów będzie 0; else 1
Co oznacza, że ​​każda linia będzie miała numer NULL, pojawi się przed pozostałymi

Należy również pamiętać, że iids zostaną posortowane.

Dostaniesz coś takiego:

  • numer null; id = 1
  • numer null; id = 2
  • numer null; id = 5
  • numer null; id = 8
  • number not null; id = 3
  • number not null; id = 4
  • number not null; id = 7
  • number not null; id = 10
  • number not null; id = 12
+0

Tak zwykle robię. – RiddlerDev

+0

Doskonale! Szybka odpowiedź, i zadziałało to po raz pierwszy próbowałem. Dziękuję Ci! – Johan

+0

Nie ma za co :-) Miłej zabawy! –

-1

Unia może również zostać wykorzystana.

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NULL 
ORDER BY id 

UNION 

SELECT id, number 
FROM Media 
WHERE user = 10 AND number IS NOT NULL 
ORDER BY id, number; 
+0

Oprócz nieco błędnej składni (brakujące nawiasy), nie ma to sensu, ponieważ 'UNION' nie gwarantuje zachowania porządku pojedynczych zaznaczeń. Poza tym tworzy niepotrzebnie kosztowny plan wykonania (dwie "NULL" sprawdza w kolumnie "liczba"). –

1

Funkcja ISNULL() zwraca 1, jeśli parametr ma wartość null, a 0 w przeciwnym razie.

SELECT id, number 
FROM Media 
WHERE user = 10 
ORDER BY ISNULL(number) DESC, id 

Pamiętaj, straszne dla wydajności w zależności od tego, ile wartości trzeba zamówić: brak indeksu będzie używany na podstawie kolumn ORDER BY.

Powiązane problemy