Puede usar COLLATE NOCASE
en su SELECT
consulta:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Además, en SQLite, puede indicar que una columna no distingue entre mayúsculas y minúsculas cuando crea la tabla especificando collate nocase
en la definición de columna (las otras opciones son binary
(el valor predeterminado) y rtrim
; consulte aquí ). También puede especificar collate nocase
cuándo crea un índice. Por ejemplo:
crear tabla de prueba
(
Text_Value text cotejar nocase
);
insertar en los valores de prueba ('A');
insertar en los valores de prueba ('b');
insertar en los valores de prueba ('C');
crear índice Test_Text_Value_Index
en prueba (Text_Value cotejar nocase);
Las expresiones involucradas Test.Text_Value
ahora deben ser insensibles a mayúsculas y minúsculas. Por ejemplo:
sqlite> seleccione Text_Value de Test donde Text_Value = 'B';
Text_Value
----------------
si
sqlite> seleccione Text_Value del orden de prueba por Text_Value;
Text_Value
----------------
UNA
si
C
sqlite> seleccione Text_Value del orden de prueba por Text_Value desc;
Text_Value
----------------
C
si
UNA
El optimizador también puede hacer uso del índice para buscar y hacer coincidir mayúsculas y minúsculas en la columna. Puede verificar esto usando el explain
comando SQL, por ejemplo:
sqlite> explique select Text_Value de Test donde Text_Value = 'b';
addr código de operación p1 p2 p3
---------------- -------------- ---------- ---------- ---------------------------------
0 Ir a 0 16
1 Entero 0 0
2 OpenRead 1 3 keyinfo (1, NOCASE)
3 SetNumColumns 1 2
4 cuerdas 8 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 Columna 1 0
12 Devolución de llamada 1 0
13 Siguiente 1 9
14 Cerrar 1 0
15 Detener 0 0
16 Transacción 0 0
17 VerifyCookie 0 4
18 Ir a 0 1
19 Noop 0 0
COLLATE NOCASE
al índice no es necesario si el campo en sí ya tiene esta colación definido: " El orden de clasificación predeterminado es el orden de clasificación definido para esa columna en la sentencia CREATE TABLE. "COLLATE NOCASE
solo funcionará con texto ASCII. Una vez que tenga "FIANCÉ" o "voilà" en los valores de su columna, no coincidirá con "prometido" o "VOILA". Después de habilitar la extensión ICU,LIKE
no distingue entre mayúsculas y minúsculas , por lo que'FIANCÉ' LIKE 'fiancé'
es cierto, pero'VOILA' LIKE 'voilà'
sigue siendo falso. E ICU + LIKE tiene el inconveniente de no usar el índice, por lo que puede ser lento en tablas grandes.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
no distingue entre mayúsculas y minúsculaslastname
. Para ser sensible a mayúsculas enfirstname
, escribir lo siguiente:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Es específico de esa columna, no lawhere
cláusula completa .fuente
Puedes hacerlo así:
(No es la solución, pero en algunos casos es muy conveniente)
fuente
Esto no es específico de sqlite pero solo puedes hacer
fuente
Otra opción es crear su propia colación personalizada. Luego puede establecer esa clasificación en la columna o agregarla a sus cláusulas de selección. Se utilizará para ordenar y hacer comparaciones.
Esto se puede usar para hacer 'VOILA' COMO 'voilà'.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
fuente
Otra opción que puede o no tener sentido en su caso, es tener una columna separada con valores precalificados de su columna existente. Esto se puede completar utilizando la función SQLite
LOWER()
, y luego puede realizar coincidencias 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.
fuente
Simplemente, puede usar COLLATE NOCASE en su consulta SELECT:
fuente
Si la columna es de tipo,
char
entonces debe agregar el valor que está consultando con espacios, consulte esta pregunta aquí . Esto además de usarCOLLATE NOCASE
o una de las otras soluciones (upper (), etc.).fuente
puede usar la consulta similar para comparar la cadena respectiva con los valores de tabla.
seleccione el nombre de la columna de table_name donde el nombre de la columna como 'valor de comparación respectivo';
fuente
Me está funcionando perfectamente.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
fuente