¿Cómo hacer una consulta que "no distinga entre mayúsculas y minúsculas" en Postgresql?

Resuelto Jame asked hace 13 años • 16 respuestas

¿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'
Jame avatar Aug 10 '11 09:08 Jame
Aceptado

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')
Chandu avatar Aug 10 '2011 02:08 Chandu

usando ILIKEen lugar deLIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'
Mohammad Reza Norouzi avatar Oct 20 '2013 07:10 Mohammad Reza Norouzi

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.

  1. 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.
  2. 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.

  1. 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.)
  2. 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.)
  3. 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 como SELECT 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.

Mike Sherrill 'Cat Recall' avatar Aug 10 '2011 03:08 Mike Sherrill 'Cat Recall'

Puedes usar ILIKE. es decir

SELECT id FROM groups where name ILIKE 'administrator'
ADJ avatar Feb 07 '2013 10:02 ADJ

También puede leer más sobre la ILIKEpalabra 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

Priidu Neemre avatar Sep 23 '2012 13:09 Priidu Neemre