2011-05-29 18 views
6

Mam tabelę zawierającą 2 rodzaje tekstu wewnątrz kolumny. Pierwszy typ to ciąg adresu e-mail (ex [email protected]), a drugi to nazwisko osoby (John Doe)Zamówienie zapytania SQlite według przypadku

Używam tego zapytania, aby posortować dane tak, aby najpierw wiersze, które nie są mają @ pokazane są char, a następnie te, które mają go:

SELECT * 
    FROM Name 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END 

więc co mogę zrobić, to przypadki, które mają być sortowane rosnąco tak, że mam nazwy klasyfikowane według litery rosnąco poniższego e-maile posortowane według litery rosnąco.

Odpowiedz

13

zastosowanie:

SELECT n.* 
    FROM NAME n 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END, n.displayname COLLATE NOCASE 

The ORDER BY podpór klauzula więcej niż jedna kolumna, ale priorytet jest czytany od lewej do prawej. Tak więc wartości displayname z "@" w nich są na górze, a następnie uporządkowane według wartości displayname w tym każdym grupowaniu (na podstawie instrukcji CASE).

Należy sprawdzić, czy przy porównywaniu wielkości liter nie jest rozróżniana wielkość liter.

+0

OK działa, ale nie całkowicie. bierze pod uwagę, czy litera jest ułomna, czy nie. daje mi te zaczynające się od litery upercase sortowane alfabetycznie, a następnie te zaczynające się od małych liter posortowane alfabetycznie, a następnie robi to samo z e-mailami. – DArkO

+0

Ok i zorientowałem się. dodano UPPER (displayName) po końcu, – DArkO

+0

@DArko: 'COLLATE' oferuje więcej funkcjonalności - patrz aktualizacja. –

3

Zasadniczo, to będzie wyglądać następująco:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, displayName 

Jesteś po prostu dodanie drugiego elementu być uporządkowane na liście. Najpierw zostanie posortowana według 1 lub 2 kolumny, a następnie posortuje wyniki według rzeczywistej nazwy.

Jeśli zestawień nie pozwala na sortowanie chcesz, możesz zmienić kolejność lekko, aby pomieścić to tak:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, UPPER(displayName) 
Powiązane problemy