Как использовать оператор 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.