¿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'
postgresql
Jame
fuente
fuente
Respuestas:
Use la función INFERIOR para convertir las cadenas a minúsculas antes de comparar.
Prueba esto:
fuente
varchar_pattern_ops
si desea que el índice funcione con laLIKE 'xxx%'
consulta, es decirCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
, funcionarábut with slow response
,. Para obtener un acceso rápido a las tablas en función de los resultados de los cálculos, sugiero que cualquiera que solo verifique esto deba ir con la respuesta aceptada. Ver más detalles aquí y aquíusando en
ILIKE
lugar deLIKE
fuente
ILIKE
no es compatible con Hibernate cuando se usa en Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
Spring Boot 2.0.6.RELEASE. Pero IntelliJ se queja de eso.El enfoque más común es minúsculas o mayúsculas en la cadena de búsqueda y los datos. Pero hay dos problemas con eso.
Existen al menos tres soluciones de uso menos frecuente que podrían ser más efectivas.
CREATE INDEX ON groups (name::citext);
. (Pero ver más abajo).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');
, oSELECT id FROM groups WHERE LOWER(name) = 'administrator';
debe recordar usar LOWER (), sin embargo.El módulo citext no proporciona un tipo de datos que no distinga entre mayúsculas y minúsculas. En cambio, se comporta como si cada cadena estuviera en minúscula. Es decir, se comporta como si hubiera llamado
lower()
a cada cadena, como en el número 3 anterior. La ventaja es que los programadores no tienen que recordar 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.fuente
col = 'a'
ycol = 'b'
). Acerca del n. ° 2: como dijiste, puedes crear un índice en una expresión, por lo que no es realmente un problema. Pero estoy de acuerdo con usted en que cambiar la clasificación es probablemente la mejor solución.select * from pg_collation;
.Puedes usar
ILIKE
. es decirfuente
lower
función. Ver más detallesTambién puede leer sobre la
ILIKE
palabra clave. A veces puede ser 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.htmlfuente
email ILIKE 'user-input-email-here'
, asegúrese de escapar de la entrada del usuario. De lo contrario, las personas pueden ingresar caracteres como% que coinciden con cualquier cosa.ILIKE
yprepared statements
¿esto me protegerásql injection
?lower(column_name) like %expression%
.También puede usar expresiones regulares POSIX, como
SELECT 'asd' ~* 'AsD'
devolucionest
fuente
El uso
~*
puede mejorar en gran medida el rendimiento, con la funcionalidad de INSTR.devolver filas con nombre que contiene OR es igual a 'adm'.
fuente