PostgreSQL: Cómo hacer una consulta "insensible a mayúsculas y minúsculas"


Hay alguna manera de escribir consultas que no distinguen 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'
 211
Author: Jaiswal, 2011-08-10

6 answers

Use la función LOWER para convertir las cadenas a minúsculas antes de comparar.

Prueba esto:

SELECT id 
  FROM groups
 WHERE LOWER(name)=LOWER('Administrator')
 295
Author: Chandu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-10 02:47:07

Usando ILIKE en lugar de LIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'
 115
Author: Mohammad Reza Norouzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-05 08:13:00

El enfoque más común es ya sea minúscula o mayúscula 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; no todas las letras mayúsculas tienen letra minúscula.
  2. Usando funciones como lower() y upper() le dará una secuencia escanear. No puede usar índices. En mi sistema de prueba, usando lower() toma aproximadamente 2000 veces más que una consulta que puede usar un índice. (Los datos de prueba tienen un poco más de 100k filas.)

Hay al menos tres soluciones menos utilizadas 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 distingue 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 distingue entre mayúsculas y minúsculas. Esto se establece cuando usted inicializar a base. 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í volverás resultados útiles. (También significa que no puede hacer consultas sensibles a mayúsculas y minúsculas. Duh.)
  3. Cree un índice funcional. Cree un índice en minúsculas usando CREATE INDEX ON groups (LOWER(name));. Habiendo hecho eso, puedes tomar ventaja del índice con consultas como SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');, o SELECT id FROM groups WHERE LOWER(name) = 'administrator'; Tienes que recordar usar LOWER(), sin embargo.

El módulo citext no proporciona un tipo de datos que no distingue entre mayúsculas y minúsculas. En su lugar, se comporta como si cada cadena estuviera en minúsculas. Es decir, se comporta como si hubieras llamado lower() en 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 usar citext.

 96
Author: Mike Sherrill 'Cat Recall',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 20:48:33

Puede usar ILIKE. es decir,

SELECT id FROM groups where name ILIKE 'administrator'
 77
Author: Jaiswal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-05 07:59:50

También puedes leer la palabra clave ILIKE. Puede ser bastante útil a veces, aunque no se ajusta al estándar SQL. Ver aquí para más información: http://www.postgresql.org/docs/9.2/static/functions-matching.html

 48
Author: Priidu Neemre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-23 20:27:05

También puedes usar expresiones regulares POSIX, como

SELECT id FROM groups where name ~* 'administrator'

SELECT 'asd' ~* 'AsD' devuelve t

 15
Author: James Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 13:44:50