Quiero seleccionar registros de la base de datos sqlite3 por coincidencia de cadenas. Pero si uso '=' en la cláusula where, descubrí que sqlite3 distingue entre mayúsculas y minúsculas. ¿Alguien puede decirme cómo usar la secuencia de comparaciones que no distingue entre mayúsculas y minúsculas?¿Cómo configurar Sqlite3 para que no distinga entre mayúsculas y minúsculas cuando se compara una cadena?
Respuesta
puede utilizar COLLATE NOCASE
en su SELECT
consulta:..
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Además, en SQLite, puede indicar que una columna no debe tener en cuenta mayúsculas y minúsculas al crear la tabla especificando collate nocase
en la definición de columna (las otras opciones son binary
(valor predeterminado) y rtrim
; ver here). Puede especificar collate nocase
cuando también crea 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);
Expresiones con Test.Text_Value
ahora debería ser sensible a mayú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 utilizar potencialmente el índice para búsqueda y coincidencia insensible a mayúsculas y minúsculas en la columna. Esto se puede comprobar mediante el comando explain
SQL, 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
Esto no es específico de SQLite, pero sólo se puede hacer
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
¿Hay alguna pérdida de rendimiento al hacer esto? – quantity
La otra parte del problema de rendimiento es encontrar las filas coincidentes en la tabla. ¿Admite SQLite3 los índices basados en funciones? Indexar la columna o expresión de búsqueda (por ejemplo, "UPPER (name)") en una situación como esta suele ser una buena idea. – cheduardo
Tenga cuidado con este, como insinuó cheduardo, SQLite no puede hacer uso de un índice sobre 'nombre' al ejecutar esta consulta. El motor db necesitará escanear por completo todas las filas, convertir todos los campos 'nombre' a mayúsculas y ejecutar la comparación. –
Puede hacerlo de esta manera:
SELECT * FROM ... WHERE name LIKE 'someone'
(No es la solución, pero en algunos casos es muy conveniente)
"COMO ópera tor hace un patrón de comparación . El operando a a la derecha contiene el patrón, el operando de la izquierda contiene la cadena para que coincida con el patrón. Un símbolo de porcentaje ("%") en el patrón coincide con cualquier secuencia de caracteres en la cadena. Un subrayado ("_") en el patrón coincide con cualquier carácter único en la cadena . Cualquier otro carácter coincide sí mismo o que es inferior/superior caso equivalente (es decir, sensible a las mayúsculas de juego). (A ERROR: SQLite solamente entiende mayúsculas/minúsculas para ASCII caracteres El operador LIKE es caso sensible para caracteres Unicode que están más allá del rango ASCII Para ejemplo, la expresión 'a' LIKE 'A' es.. es cierto, pero 'æ' LIKE 'Æ' es FALSO) "
@ MM-BB sí, a menos que realicemos el LIKE en una columna que está declarada (o indexada) como COLLATE NOCASE, hará un escaneo completo de las filas. –
No es un error, es una limitación documentada. La misma página citada en la respuesta menciona la extensión de la ICU que administra los caracteres Unicode. (Tal vez no fue el caso en 2009) – stenci
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Si eres como yo y quieres más documentación sobre Collating, puedes encontrarla aquí en esta página: http: //www.sqlite.org/datatype3.html Just scroll hasta # 6.0 – Will
Si la columna es de tipo char
entonces usted necesita para añadir el valor que está consultando con espacios, por favor refiérase a esta pregunta here.Esto además de usar COLLATE NOCASE
o una de las otras soluciones (superior(), etc.).
Otra opción es crear su propia intercalación personalizada. Luego puede establecer esa intercalación en la columna o agregarla a sus cláusulas de selección. Se usará para pedidos y comparaciones.
Esto se puede utilizar para hacer '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 es negativo, cero o positivo si la primera cadena es menor que, igual a, o mayor que el segundo, respectivamente.
Otra opción que puede o no tener sentido en su caso, es tener realmente una columna separada con valores pre-reducidos de su columna existente. Esto se puede completar con la función SQLite LOWER()
, y luego puede realizar la coincidencia en esta columna.
Obviamente, agrega redundancia y una posibilidad de incoherencia, pero si sus datos son estáticos, podría ser una opción adecuada.
puede usar la consulta similar para comparar la cadena respectiva con los valores de la tabla.
Seleccione el nombre de la columna de nombre_tabla donde el nombre de la columna sea igual a 'valor de comparación respectivo';
Me funciona perfectamente. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
- 1. Cómo configurar MySQL para que distinga entre mayúsculas y minúsculas
- 2. ¿Cómo hacer que Regex no distinga entre mayúsculas y minúsculas?
- 3. Hacer que Entity Framework no distinga entre mayúsculas y minúsculas
- 4. ¿Puedo hacer que Subversion + TortoiseSVN no distinga entre mayúsculas y minúsculas para Windows?
- 5. ¿Es posible que lxml funcione de manera que no distinga entre mayúsculas y minúsculas?
- 6. ¿Cómo puedo hacer que la búsqueda de la tecla hash no distinga entre mayúsculas y minúsculas?
- 7. Forzar consulta de T-SQL para que distinga entre mayúsculas y minúsculas en MS
- 8. ¿Hay alguna manera en Oracle de hacer que una columna no distinga entre mayúsculas y minúsculas?
- 9. ¿Es posible que BeautifulSoup funcione de manera que no distinga entre mayúsculas y minúsculas?
- 10. ¿Hay alguna forma de configurar Redis para que no distinga entre mayúsculas y minúsculas con respecto a las claves?
- 11. ¿Cómo puedo hacer que Array.Contains distinga entre mayúsculas y minúsculas en una matriz de cadenas?
- 12. ¿Cómo cambio SQL Server 2005 para que distinga entre mayúsculas y minúsculas?
- 13. Hacer que el elemento ArrayList no distinga entre mayúsculas y minúsculas
- 14. getOptions Perl() entre mayúsculas y minúsculas
- 15. Detectando cadena que comienza con expresión y no distingue entre mayúsculas y minúsculas
- 16. RegularExpressionAttribute - ¿Cómo hacer que no distinga entre mayúsculas y minúsculas para la validación del lado del cliente?
- 17. ¿Cómo puedo hacer que mi servidor local distinga entre mayúsculas y minúsculas?
- 18. ¿Se puede hacer que el glob() de PHP busque archivos de manera que no distinga entre mayúsculas y minúsculas?
- 19. Cómo reemplazar una cadena que no distingue entre mayúsculas y minúsculas en el objetivo-c iphone?
- 20. ¿PHP no distingue entre mayúsculas y minúsculas?
- 21. ¿Hace que mysql sea sensible a mayúsculas y minúsculas?
- 22. GetElementsByTagName que no distingue entre mayúsculas y minúsculas?
- 23. Explotar una cadena en mayúsculas y minúsculas?
- 24. ¿Puedo forzar la distinción entre mayúsculas y minúsculas del nombre de tabla MySql en sistemas de archivos que no distinguen entre mayúsculas y minúsculas?
- 25. Cómo agregar una opción entre mayúsculas y minúsculas a Array.indexOf
- 26. ¿Alguien tuvo éxito al usar una configuración regional específica para una base de datos PostgreSQL para que la comparación de texto no distinga entre mayúsculas y minúsculas?
- 27. NSMutableArray clasificación - entre mayúsculas y minúsculas
- 28. OData y distinción entre mayúsculas y minúsculas
- 29. ¿Cómo se crean rutas que no distinguen entre mayúsculas y minúsculas en Sinatra?
- 30. expresiones regulares entre mayúsculas y minúsculas
Después de (re) crear la tabla con 'COLLATE NOCASE', noté que era _mucho_ más rápido que la consulta WHERE name = 'someone' COLLATE NOCASE. MUCHO más rápido (de seis a 10 veces, ¿aproximadamente?) – DefenestrationDay
De acuerdo con la documentación, no es necesario agregar 'COLLATE NOCASE' al índice si el campo ya tiene esta clasificación definida:" [* La secuencia de clasificación predeterminada es la secuencia de clasificación definido para esa columna en la instrucción CREATE TABLE. *] (http://www.sqlite.org/lang_createindex.html) " – Heinzi
' COLLATE NOCASE' solo funcionará con texto ASCII. Una vez que tenga "FIANCÉ" o "voilà" en los valores de su columna, no coincidirá con "fiancé" o "VOILA". Después de habilitar la extensión de la ICU, ['LIKE' no distingue entre mayúsculas y minúsculas] (http://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt), por lo que' 'FIANCÉ' LIKE ' fiancé'' es cierto, pero ''VOILA 'LIKE' voilà'' sigue siendo falso. Y ICU + LIKE tiene el inconveniente de no usar el índice, por lo que puede ser lento en las tablas grandes. –