Як використовувати порядок 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.