SQlite запрос в каждом конкретном случае - PullRequest
7 голосов
/ 29 мая 2011

У меня есть таблица, содержащая 2 типа текста внутри столбца.Первый тип - это строка адреса электронной почты (например, 222@dsad.com), а второй - имя человека (Джон Доу)

. Я использую этот запрос для сортировки данных, чтобы сначала получить строки, которыене отображается @ char, а затем те, у которых он есть:

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

Так что я не могу сделать так, чтобы сортировки по возрастанию делались так, чтобы имена сортировались по буквампо возрастанию, следуя электронным письмам, отсортированным по возрастанию.

Ответы [ 2 ]

14 голосов
/ 29 мая 2011

Использование:

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

Предложение ORDER BY поддерживает более одного столбца, но приоритет читается слева направо.Таким образом, значения displayname со знаком «@» находятся вверху, а затем упорядочены по значению displayname в каждой группе (на основе оператора CASE).

Вам нужно посмотреть наиспользуя оператор COLLATE для сравнения без учета регистра.

3 голосов
/ 29 мая 2011

По сути, это будет выглядеть так:

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

Вы просто добавляете второй элемент для сортировки в списке.Сначала это будет отсортировано по столбцу 1 или 2. Затем результаты будут отсортированы по фактическому имени.

Если ваша сортировка не позволяет выполнить желаемую сортировку, вы можете слегка изменить ORDER BY, чтобы вместитьэто примерно так:

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