Existe-t-il un moyen d'écrire des requêtes insensibles à la casse dans PostgreSQL, par exemple, je veux que les 3 requêtes suivantes retournent le même résultat.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Jame
la source
la source
Réponses:
Utilisez la fonction LOWER pour convertir les chaînes en minuscules avant de comparer.
Essaye ça:
la source
varchar_pattern_ops
si vous souhaitez que l'index fonctionne avec laLIKE 'xxx%'
requête, c'est-à-direCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
, cela fonctionnerabut with slow response
,. Pour obtenir un accès rapide aux tableaux basés sur les résultats des calculs, je suggère à quiconque vérifie cela de bien vouloir accepter la réponse acceptée. Voir plus de détails ici et iciutiliser
ILIKE
au lieu deLIKE
la source
ILIKE
n'est pas pris en charge par Hibernate lorsqu'il est utilisé dans Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
et Spring Boot 2.0.6.RELEASE. Mais IntelliJ s'en plaint.L'approche la plus courante consiste à minuscules ou majuscules la chaîne de recherche et les données. Mais cela pose deux problèmes.
Il existe au moins trois solutions moins fréquemment utilisées qui pourraient être plus efficaces.
CREATE INDEX ON groups (name::citext);
. (Mais voir ci-dessous.)CREATE INDEX ON groups (LOWER(name));
. Cela fait, vous pouvez profiter de l'index avec des requêtes commeSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, ouSELECT id FROM groups WHERE LOWER(name) = 'administrator';
vous devez vous rappeler d'utiliser LOWER (), cependant.Le module citext ne fournit pas un véritable type de données insensible à la casse. Au lieu de cela, il se comporte comme si chaque chaîne était en minuscule. Autrement dit, il se comporte comme si vous aviez appelé
lower()
chaque chaîne, comme dans le numéro 3 ci-dessus. L'avantage est que les programmeurs n'ont pas à se rappeler de mettre des chaînes en minuscules. Mais vous devez lire les sections "Comportement de comparaison de chaînes" et "Limitations" dans les documents avant de décider d'utiliser citext.la source
col = 'a'
etcol = 'b'
). À propos de # 2: Comme vous l'avez dit, vous pouvez créer un index sur une expression, donc ce n'est pas vraiment un problème. Mais je suis d'accord avec vous que changer le classement est probablement la meilleure solution.select * from pg_collation;
.Vous pouvez utiliser
ILIKE
. c'est à direla source
lower
fonction. Voir plus de détailsVous pouvez également lire le
ILIKE
mot - clé. Il peut parfois être très utile, bien qu'il ne soit pas conforme à la norme SQL. Voir ici pour plus d'informations: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlla source
email ILIKE 'user-input-email-here'
, assurez-vous d'échapper à l'entrée utilisateur. Sinon, les gens peuvent entrer des caractères comme% qui correspondent à n'importe quoi.ILIKE
etprepared statements
cela me protégera-sql injection
t-il?lower(column_name) like %expression%
.Vous pouvez également utiliser des expressions régulières POSIX, comme
SELECT 'asd' ~* 'AsD'
Retourt
la source
L'utilisation
~*
peut améliorer considérablement les performances, avec les fonctionnalités de INSTR.renvoie des lignes dont le nom contient OU égal à «adm».
la source