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'
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')
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'
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.
- 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.
- 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.
- 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.) - 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.)
- 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 comoSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, oSELECT 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.
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'
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
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
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