2009-07-27 22 views
16

Tengo una consulta para la base de datos sqlite3 que proporciona los datos ordenados. Los datos se ordenan sobre la base de una columna que es una columna "Nombre" varchar. Ahora cuando hago la consulta¿Cómo cambiar la intercalación de la base de datos sqlite3 para ordenar las mayúsculas y minúsculas de forma insensible?

select * from tableNames Order by Name; 

Proporciona los datos como este.

 
    Pen 
    Stapler 
    pencil 

Significa que está considerando las cosas sensibles a mayúsculas y minúsculas. La forma en que quiero es la siguiente

 
    Pen 
    pencil 
    Stapler 

¿Qué cambios debo hacer en la base de datos sqlite3 para obtener los resultados necesarios?

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

Respuesta

10

El SQLite Datatypes documentation discute secuencias de intercalación definidos por el usuario. Específicamente, usa COLLATE NOCASE para lograr su objetivo.

dan un ejemplo:

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

y observe que:

- La agrupación se realizó usando la secuencia de intercalación NOCASE (es decir, valores - 'abc' y 'ABC' se colocan en el mismo grupo). SELECCIONAR recuento (*) GRUPO POR d DESDE t1;

+2

¿Funcionará "COLLATE NOCASE" para cualquier idioma? De lo contrario, ¿cómo se puede ordenar en un campo de texto de una manera que no distingue entre mayúsculas y minúsculas, si no se conoce el idioma específico en el momento de la compilación? –

+0

IIRC sqlite3 es nativamente UTF-8, por lo que la intercalación debe realizarse de acuerdo con las reglas Unicode UTF-8. Esto podría, por supuesto, no ser lo que el usuario esperaba ... –

+0

@moodforaday: No está disponible con la intercalación NOCASE incorporada. Lo que sí puede hacer es redefinir la intercalación NOCASE en su aplicación e implementar la ordenación según la configuración regional actual del sistema/usuario. Simplemente llame su colación personalizada "NOCASE". – wqw

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

Michael van der Westhuizen explica en su comentario a continuación por qué esta no es una buena manera. Me voy de esta respuesta hasta el fin de preservar su comentario y para servir como una advertencia a otros que podrían tener la misma idea 'brillante' que tenía ;-)

+0

Esto no es una gran idea: ordenar por una función en la que no tenga índices basados ​​en funciones dará como resultado problemas de rendimiento y escalabilidad. Vea la respuesta de Dror Harari más arriba sobre la forma correcta de hacerlo en sqlite3. Si usaba Oracle con un índice basado en funciones en lower (Name), esto estaría bien, pero no en este caso. –

20

Para solucionarlo mayúsculas y minúsculas puede utilizar ORDER BY Name COLLATE NOCASE

1

Utilice esta declaración en su base de datos SQLite:

PRAGMA case_sensitive_like = false 
+1

El tipo de mayúsculas y minúsculas ya es falso para los caracteres ASCII y distingue entre mayúsculas y minúsculas para los caracteres Unicode que están más allá del rango ASCII. [enlace] (http://www.sqlite.org/lang_expr.html) –

Cuestiones relacionadas