¿Cómo hacer una consulta que "no distinga entre mayúsculas y minúsculas" en Postgresql?
¿Hay alguna forma de escribir consultas que no distingan entre mayúsculas y minúsculas en PostgreSQL? Por ejemplo, quiero que las siguientes 3 consultas devuelvan el mismo resultado.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
Utilice la función INFERIOR para convertir las cadenas a minúsculas antes de comparar.
Prueba esto:
SELECT id
FROM groups
WHERE LOWER(name)=LOWER('Administrator')
usando ILIKE
en lugar deLIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
El enfoque más común es poner en mayúsculas o minúsculas la cadena de búsqueda y los datos. Pero hay dos problemas con eso.
- Funciona en inglés, pero no en todos los idiomas. (Tal vez ni siquiera en la mayoría de los idiomas). No todas las letras minúsculas tienen una letra mayúscula correspondiente; no todas las letras mayúsculas tienen una letra minúscula correspondiente.
- El uso de funciones como lower() y Upper() le dará un escaneo secuencial. No puede usar índices. En mi sistema de prueba, usar lower() lleva aproximadamente 2000 veces más que una consulta que puede usar un índice. (Los datos de prueba tienen un poco más de 100.000 filas).
Hay al menos tres soluciones utilizadas con menos frecuencia que podrían ser más efectivas.
- Utilice el módulo citext , que en su mayoría imita el comportamiento de un tipo de datos que no distingue entre mayúsculas y minúsculas. Una vez cargado ese módulo, puede crear un índice que no distinga entre mayúsculas y minúsculas mediante
CREATE INDEX ON groups (name::citext);
. (Pero ver más abajo.) - Utilice una intercalación que no distinga entre mayúsculas y minúsculas. Esto se establece cuando inicializa una base de datos. El uso de una intercalación que no distingue entre mayúsculas y minúsculas significa que puede aceptar casi cualquier formato del código del cliente y aún así obtendrá resultados útiles. (También significa que no puede realizar consultas que distingan entre mayúsculas y minúsculas. Duh.)
- Crea un índice funcional. Cree un índice en minúsculas usando
CREATE INDEX ON groups (LOWER(name));
. Una vez hecho esto, puede aprovechar el índice con consultas comoSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, o Sin embargo,SELECT id FROM groups WHERE LOWER(name) = 'administrator';
debe recordar usar LOWER().
El módulo citext no proporciona un tipo de datos que realmente no distinga entre mayúsculas y minúsculas. En cambio, se comporta como si cada cadena estuviera en minúsculas. Es decir, se comporta como si hubieras llamado lower()
a cada cadena, como en el número 3 anterior. La ventaja es que los programadores no tienen que recordar las cadenas en minúsculas. Pero debe leer las secciones "Comportamiento de comparación de cadenas" y "Limitaciones" en los documentos antes de decidir utilizar citext.
Puedes usar ILIKE
. es decir
SELECT id FROM groups where name ILIKE 'administrator'
También puede leer más sobre la ILIKE
palabra clave. A veces puede resultar bastante útil, aunque no se ajusta al estándar SQL. Consulte aquí para obtener más información: http://www.postgresql.org/docs/9.2/static/functions-matching.html