ejemplos - ¿Cómo configurar Sqlite3 para que no se distinga entre mayúsculas y minúsculas cuando se compara una cadena?
django (10)
Quiero seleccionar registros de la base de datos sqlite3 por cadena de coincidencia. Pero si uso ''='' en la cláusula where, encontré que sqlite3 distingue entre mayúsculas y minúsculas. ¿Alguien puede decirme cómo usar cadenas que comparen entre mayúsculas y minúsculas?
Está funcionando para mí perfectamente. SELECT NAME FROM TABLE_NAME WHERE NAME = ''test Name'' COLLATE NOCASE
Esto no es específico de sqlite pero puedes hacerlo
SELECT * FROM ... WHERE UPPER(name) = UPPER(''someone'')
Otra opción es crear su propia colación personalizada. Luego puede establecer esa intercalación en la columna o agregarla a sus cláusulas de selección. Se utilizará para pedidos y comparaciones.
Esto se puede usar para hacer que ''VOILA'' LIKE ''voilà''.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
La función de clasificación debe devolver un número entero que sea negativo, cero o positivo si la primera cadena es menor, igual o mayor que la segunda, respectivamente.
Otra opción que puede o no tener sentido en su caso, es tener realmente una columna separada con valores de puntuación baja de su columna existente. Esto se puede completar utilizando la función LOWER()
, y luego puede realizar la coincidencia en esta columna.
Obviamente, agrega redundancia y un potencial de inconsistencia, pero si sus datos son estáticos, podría ser una opción adecuada.
Puedes hacerlo así:
SELECT * FROM ... WHERE name LIKE ''someone''
(No es la solución, pero en algunos casos es muy conveniente)
"El operador LIKE hace una comparación de coincidencia de patrón. El operando a la derecha contiene el patrón, el operando de la izquierda contiene la cadena que coincide con el patrón. Un símbolo de porcentaje ("% ") en el patrón coincide con cualquier secuencia de cero o más caracteres en la cadena. Un guión bajo ("_") en el patrón coincide con cualquier carácter individual de la cadena. Cualquier otro carácter coincide con sí mismo o con su equivalente en mayúsculas / minúsculas (es decir, una coincidencia que no distingue entre mayúsculas y minúsculas ) (Un error: SQLite solo entiende mayúsculas / minúsculas para caracteres ASCII. El operador LIKE distingue entre mayúsculas y minúsculas para caracteres Unicode que están más allá del rango ASCII. Por ejemplo, la expresión ''a'' LIKE ''A'' es VERDADERA pero ''æ'' LIKE ''Æ'' es FALSA.) . "
Si la columna es de tipo char
entonces debe agregar el valor que está consultando con espacios, consulte esta pregunta here . Esto además de usar COLLATE NOCASE
o una de las otras soluciones (upper (), etc.).
Simplemente, puede usar COLLATE NOCASE en su consulta SELECT:
SELECT * FROM ... WHERE name = ''someone'' COLLATE NOCASE
puede utilizar la consulta similar para comparar la cadena respectiva con valores de tabla.
seleccione el nombre de la columna de nombre_tabla donde el nombre de la columna es como ''valor de comparación respectivo'';
Puede usar COLLATE NOCASE
en su consulta SELECT
:
SELECT * FROM ... WHERE name = ''someone'' COLLATE NOCASE
Además, en SQLite, puede indicar que una columna no debe distinguirse entre mayúsculas y minúsculas cuando cree la tabla especificando collate nocase
en la definición de la columna (las otras opciones son binary
(la rtrim
predeterminada) y rtrim
; consulte here ). También puede especificar el collate nocase
al crear un índice. Por ejemplo:
create table Test ( Text_Value text collate nocase ); insert into Test values (''A''); insert into Test values (''b''); insert into Test values (''C''); create index Test_Text_Value_Index on Test (Text_Value collate nocase);
Las expresiones que involucran Test.Text_Value
ahora deben ser sensibles a mayúsculas y minúsculas. Por ejemplo:
sqlite> select Text_Value from Test where Text_Value = ''B''; Text_Value ---------------- b sqlite> select Text_Value from Test order by Text_Value; Text_Value ---------------- A b C sqlite> select Text_Value from Test order by Text_Value desc; Text_Value ---------------- C b A
El optimizador también puede hacer uso del índice para búsquedas y coincidencias en la columna que no distinguen entre mayúsculas y minúsculas. Puede verificar esto usando el comando SQL explain
, por ejemplo:
sqlite> explain select Text_Value from Test where Text_Value = ''b''; addr opcode p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 Goto 0 16 1 Integer 0 0 2 OpenRead 1 3 keyinfo(1,NOCASE) 3 SetNumColumns 1 2 4 String8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 0 0 10 IdxGE 1 14 + 11 Column 1 0 12 Callback 1 0 13 Next 1 9 14 Close 1 0 15 Halt 0 0 16 Transaction 0 0 17 VerifyCookie 0 4 18 Goto 0 1 19 Noop 0 0
SELECT * FROM ... WHERE name = ''someone'' COLLATE NOCASE