2009-07-27 3 views
16

У меня есть запрос для базы данных sqlite3, которая предоставляет отсортированные данные. Данные сортируются на основе столбца, который является столбцом «Имя». Теперь, когда я делаю запросКак изменить сортировку базы данных sqlite3 для незаметного сортировки регистра?

select * from tableNames Order by Name; 

Он предоставляет такие данные.

 
    Pen 
    Stapler 
    pencil 

Означает, что он рассматривает материал, чувствительный к делу. Способ, который я хочу, следующий:

 
    Pen 
    pencil 
    Stapler 

Итак, какие изменения следует внести в базу данных sqlite3 для получения необходимых результатов?

Связанные How to set Sqlite3 to be case insensitive when string comparing?

ответ

10

Datatypes documentation SQLite обсуждает определяемые пользователем последовательности сортировки. В частности, вы используете COLLATE NOCASE для достижения своей цели.

Они дают пример:

CREATE TABLE t1(
    a,     -- default collation type BINARY 
    b COLLATE BINARY, -- default collation type BINARY 
    c COLLATE REVERSE, -- default collation type REVERSE 
    d COLLATE NOCASE -- default collation type NOCASE 
); 

и отмечают, что:

- Группировка выполняются с использованием последовательности сортировки NoCase (т.е. значением - 'а' и 'ABC' размещены в той же группы). SELECT count (*) GROUP BY d FROM t1;

+2

Будет ли «COLLATE NOCASE» работать на любом языке? Если нет, то как можно сортировать текстовое поле без учета регистра, если конкретный язык не известен во время компиляции? –

+0

IIRC sqlite3 является изначально UTF-8, поэтому сопоставление должно происходить в соответствии с правилами Unicode UTF-8. Это может, конечно, не быть тем, чего ожидал пользователь ... –

+0

@moodforaday: Не со встроенной сортировкой NOCASE. Вы можете переопределить классификацию NOCASE в своем приложении и выполнить сортировку на основе текущей локали системы/пользователя. Просто назовите свою собственную сортировку «NOCASE». – wqw

2
select * from tableNames Order by lower(Name); 

Michael van der Westhuizen объясняет в своем комментарии ниже, почему это не очень хорошо. Я оставляю этот ответ так, чтобы сохранить свой комментарий и служить предупреждением для других людей, которые могли бы иметь один и ту же «яркую» идею, которую я имел ;-)

+0

Это не отличная идея - упорядочение по функции, в которой у вас нет функциональных индексов, приведет к проблемам с производительностью и масштабируемостью. См. Ответ Dror Harari выше для правильного способа сделать это в sqlite3. Если вы использовали Oracle с индексом на основе функций ниже (Name), это было бы нормально, но не в этом случае. –

20

Чтобы отсортировать его нечувствительна к регистру Вы можете использовать ORDER BY Name COLLATE NOCASE

1

Используйте этот оператор в базе данных SQLite:

PRAGMA case_sensitive_like = false 
+1

Чувствительность к регистру, как и для символов ASCII, уже неверна, а для символов Unicode, выходящих за пределы диапазона ASCII, по умолчанию чувствителен к регистру. [Ссылка] (http://www.sqlite.org/lang_expr.html) –

Смежные вопросы