Як використовувати порядок SQL за заявою, щоб сортувати результати, нечутливі до регістру?


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
А який більш ефективний спосіб це зробити? "ЗАМОВЛЕННЯ НАЗВАННЯМ НАЗВОЛЕННЯ НОКАЗИ" або "ЗАМОВЛЕННЯ ПО МИСЛОМ (НАЗВА)" (FYI, у моєму випадку працює на Android, тобто SQLite)
Паскаль

Відповіді:


253

Ви також можете зробити ORDER BY TITLE COLLATE NOCASE.

Редагувати: Якщо вам потрібно вказати ASCабо DESC, додайте це після NOCASEподібного

ORDER BY TITLE COLLATE NOCASE ASC

або

ORDER BY TITLE COLLATE NOCASE DESC

8
Є "ЗАМОВЛЕННЯ НАЗВИТИМ НАЗАДУ КОЛЛАТУ" більш ефективним, ніж "ЗАМОВЛЕННЯ НИЖКОЮ (НАЗВА)"?
Паскаль

ТОМ ПІСЛИ! чи не так? Оце Так! чому чортове SQLite робить його чутливим до регістру для сортування .... не вписується в мою думку ... на жаль!
Вінсі

1
@Vincy: Я не бачу, що дивного порівняння рядків з урахуванням регістру. Ось як <, ==і т.д. оператори працюють за замовчуванням на будь-якій мові програмування , який я знаком с.
dan04

@ dan04, як часто вам потрібен рядок, який повинен бути чутливим до регістру? тому це смішно. хто у світі дбає про випадки під час сортування рядка? Єдине місце, в якому я бачу перевагу, - це автентифікація або перевірка пароля! Ось чому за замовчуванням це повинно бути СЛУЧАЛЬНО НЕЗАЛЕЗНИМ, imo!
Вінсі

Зазвичай це не вийде, якщо база даних використовує UTF8. (Зверніть увагу, що заголовок не стосується лише SQLite.) У цьому випадку пропозиція використовувати нижній () або верхній () внизу є тим, що працює.
Марко

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
Дякую за вашу відповідь. Але: У хорошій відповіді завжди буде пояснення того, що було зроблено і чому це було зроблено таким чином, не тільки для ОП, але і для майбутніх відвідувачів ПС.
B001 ᛦ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.