2009-07-27 6 views
16

Ho una query per il database sqlite3 che fornisce i dati ordinati. I dati sono ordinati sulla base di una colonna che è una colonna "Nome" varchar. Ora quando faccio la domandaCome modificare le regole di confronto del database sqlite3 per ordinare il caso in modo insensibile?

select * from tableNames Order by Name; 

Fornisce i dati come questo.

 
    Pen 
    Stapler 
    pencil 

Significa che sta prendendo in considerazione la distinzione tra maiuscole e minuscole. Il modo che voglio è il seguente

 
    Pen 
    pencil 
    Stapler 

Quindi quali modifiche devo apportare nel database sqlite3 per i risultati necessari?

correlati How to set Sqlite3 to be case insensitive when string comparing?

risposta

10

Lo SQLite Datatypes documentation illustra sequenze di confronto definiti dall'utente. Nello specifico, usi COLLATE NOCASE per raggiungere il tuo obiettivo.

danno un esempio:

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

e notare che:

- raggruppamento viene eseguita utilizzando la sequenza di confronto NOCASE (cioè valori - 'abc' e 'ABC' sono collocati in lo stesso gruppo). SELECT count (*) GROUP BY d FROM t1;

+2

"COLLATE NOCASE" funzionerà per qualsiasi lingua? Altrimenti, come si può ordinare su un campo di testo in modo non sensibile al maiuscolo/minuscolo, se la lingua specifica non è nota al momento della compilazione? –

+0

IIRC sqlite3 è nativamente UTF-8, quindi le regole di confronto devono essere eseguite in base alle regole Unicode UTF-8. Questo potrebbe, ovviamente, non essere ciò che l'utente si aspettava ... –

+0

@moodforaday: Non fuori con regole di confronto NOCASE incorporate. È possibile ridefinire le regole di confronto NOCASE nell'applicazione e implementare l'ordinamento in base alle impostazioni locali di sistema/utente correnti. Basta nominare la tua fascicolazione personalizzata "NOCASE". – wqw

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

Michael van der Westhuizen spiega nel suo commento seguente perché questo non è un buon modo. Lascio questa risposta in modo da preservare il suo commento e di servire come monito per altri che potrebbero avere la stessa idea 'brillante' ho avuto ;-)

+0

Questa non è una buona idea: l'ordinamento di una funzione in cui non si hanno indici basati sulle funzioni si tradurrà in problemi di prestazioni e scalabilità. Vedi la risposta di Dror Harari sopra per il modo giusto di farlo in sqlite3. Se si stesse utilizzando Oracle con un indice basato su funzioni in basso (Name), questo sarebbe OK, ma non in questo caso. –

20

per risolvere la case insensitive è possibile utilizzare ORDER BY Name COLLATE NOCASE

1

Utilizzare questa istruzione nel database SQLite:

PRAGMA case_sensitive_like = false 
+1

Maiuscole e minuscole è già falso per i caratteri ASCII e sensibile alla distinzione tra maiuscole e minuscole per i caratteri unicode oltre l'intervallo ASCII. [Link] (http://www.sqlite.org/lang_expr.html) –