Как использовать оператор SQL Order By для сортировки результатов без учета регистра?


144

У меня есть база данных SQLite, которую я пытаюсь отсортировать по алфавиту. Проблема в том, что SQLite, похоже, не учитывает A = a во время сортировки, поэтому я получаю такие результаты:

A B C T a b c g

Я хочу получить:

A a b B C c g T

Что нужно сделать с SQL, чего я не знаю?

SELECT * FROM NOTES ORDER BY title

2
И какой способ сделать это эффективнее? «ЗАКАЗАТЬ НАЗВАНИЕ КОЛЛАТА NOCASE» или «ЗАКАЗАТЬ ПО НИЖЕ (НАЗВАНИЕ)». (К вашему сведению, в моем случае, работает на Android, т.е. SQLite)
Паскаль

Ответы:


253

Вы также можете сделать ORDER BY TITLE COLLATE NOCASE.

Изменить: Если вам нужно указать ASCили DESC, добавьте это после NOCASEкак

ORDER BY TITLE COLLATE NOCASE ASC

или

ORDER BY TITLE COLLATE NOCASE DESC

8
Является ли "ORDER BY TITLE COLLATE NOCASE" более эффективным, чем "ORDER BY LOWER (TITLE)"?
Паскаль

Это сосет! не так ли? Вот Это Да! почему, черт возьми, SQLite делает его чувствительным к регистру для сортировки ... не в моей голове ... к сожалению!
Винси

1
@Vincy: я не вижу, что странного в сравнении строк с учетом регистра. Вот как <, ==и т.д. операторы работают по умолчанию на любом языке программирования , который я знаком с.
dan04

@ dan04 как часто вам нужна строка, чувствительная к регистру? вот почему это смешно. кого в мире волнуют случаи при сортировке строки? Единственное место, где я вижу преимущество - это аутентификация или проверка пароля! Вот почему по умолчанию это должно быть CASE INSENSITIVE, IMO!
Винси

Обычно это не работает из коробки, если база данных использует UTF8. (Обратите внимание, что заголовок относится не только к SQLite.) В этом случае ниже предлагается использовать lower () или upper ().
Марко

99

Вы можете просто преобразовать все в нижний регистр в целях сортировки:

SELECT * FROM NOTES ORDER BY LOWER(title);

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

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
Я сортирую по нескольким столбцам, нужно ли ставить НИЖЕ вокруг каждого?
CodeFusionMobile

2
Да, нет способа изменить поведение ORDER BY, чтобы оно не чувствительно к регистру.
Чад Берч

1
Есть ли разница между «ВЕРХНИЙ» и «НИЖНИЙ»
Jagadeesh

2
Для этого ни один из них не достигнет одинакового эффекта, то есть сделает случай всех предметов одинаковым.
Бен Барон

1
Они отличаются только для символов [] ^ _ `.
dan04

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
Спасибо за Ваш ответ. Но: Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для ФП, но и для будущих посетителей SO.
B001 ᛦ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.