2009-07-27 16 views
16

Mam kwerendę dla bazy danych sqlite3, która zapewnia posortowane dane. Dane są sortowane na podstawie kolumny, która jest kolumną "Nazwa". Teraz, gdy wykonuję zapytanie, dostarcza ono takich danych.Jak zmienić sortowanie bazy danych sqlite3, aby sortować wielkość liter bez potrzeby?

 
    Pen 
    Stapler 
    pencil 

Oznacza, że ​​bierze pod uwagę wielkość liter. Sposób, w jaki chce się następująco

 
    Pen 
    pencil 
    Stapler 

Więc jakie zmiany należy wprowadzić w bazie sqlite3 dla niezbędnych rezultatów?

Powiązane How to set Sqlite3 to be case insensitive when string comparing?

Odpowiedz

10

SQLite Datatypes documentation omawia sekwencji sortowania zdefiniowane przez użytkownika. W szczególności używasz COLLATE NOCASE, aby osiągnąć swój cel.

Dają przykład:

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 
); 

i zauważ, że:

- Grupowanie odbywa się za pomocą sekwencji sortowania NOCASE (czyli wartości - 'abc' i 'ABC' są umieszczane w ta sama grupa). SELECT count (*) GROUP BY d FROM t1;

+2

Czy "COLLATE NOCASE" będzie działać dla dowolnego języka? Jeśli nie, w jaki sposób można sortować na polu tekstowym w sposób niewrażliwy na wielkość liter, jeśli określony język nie jest znany podczas kompilacji? –

+0

IIRC sqlite3 jest natywnie UTF-8, więc sortowanie powinno się odbywać zgodnie z zasadami Unicode UTF-8. Nie może to być oczywiście to, czego użytkownik oczekiwał ... –

+0

@moodforaday: Nie jest dostępny z wbudowanym układem NOCASE. Możesz tylko przedefiniować układanie NOCASE w aplikacji i zaimplementować sortowanie w oparciu o bieżące ustawienia regionalne systemu/użytkownika. Po prostu nazwij swoje własne sortowanie "NOCASE". – wqw

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

Michael van der Westhuizen wyjaśnia w swoim komentarzu poniżej, dlaczego nie jest to dobry sposób. Wyjeżdżam tę odpowiedź w górę, tak aby zachować swój komentarz i służyć jako ostrzeżenie dla innych, którzy mogą mieć tę samą ideę „jasne” miałem ;-)

+0

To nie jest świetny pomysł - zamawianie przez funkcję, w której nie masz indeksów opartych na funkcjach, spowoduje problemy z wydajnością i skalowalnością. Zobacz odpowiedź od Dror Harari powyżej, aby uzyskać właściwą drogę do tego w sqlite3. Jeśli używasz Oracle z indeksem opartym na funkcjach na niższym (Nazwa), będzie to OK, ale nie w tym przypadku. –

20

Aby posortować je uwzględnia wielkości liter można użyć ORDER BY Name COLLATE NOCASE

1

Użyj tej instrukcji w bazie danych SQLite:

PRAGMA case_sensitive_like = false 
+1

Rozróżnianie wielkości liter jest już fałszywe w przypadku znaków ASCII, a wielkość liter ma domyślne znaczenie dla znaków Unicode wykraczających poza zakres ASCII. [link] (http://www.sqlite.org/lang_expr.html) –