Est-il possible d'écrire des requêtes insensibles à la casse dans PostgreSQL, E.g. 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'
Utilisez la fonction LOWER pour convertir les chaînes en minuscules avant de les comparer.
Essaye ça:
SELECT id
FROM groups
WHERE LOWER(name)=LOWER('Administrator')
en utilisant ILIKE
au lieu de LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
L'approche la plus courante consiste à mettre en minuscule ou en majuscule 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 tirer parti de l’index avec des requêtes telles que SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
ou SELECT id FROM groups WHERE LOWER(name) = 'administrator';
. Vous devez vous rappeler pour pouvoir utiliser INFÉRIEUR (), cependant.Le module citext ne fournit pas un type de données véritablement insensible à la casse. Au lieu de cela, il se comporte comme si chaque chaîne était minuscule. Autrement dit, il se comporte comme si vous aviez appelé lower()
sur chaque chaîne, comme dans le numéro 3 ci-dessus. L'avantage est que les programmeurs n'ont pas à se souvenir des chaînes minuscules. Mais vous devez lire les sections "Comportement de comparaison de chaînes" et "Limitations" dans la documentation avant de décider d'utiliser citext.
Vous pouvez utiliser ILIKE
. c'est à dire.
SELECT id FROM groups where name ILIKE 'administrator'
Vous pouvez également consulter le mot clé ILIKE
. Cela peut parfois être très utile, même si cela n’est pas conforme au standard SQL. Voir ici pour plus d'informations: http://www.postgresql.org/docs/9.2/static/functions-matching.html
Vous pouvez également utiliser des expressions régulières POSIX, comme
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'AsD'
retourne t
L'utilisation de ~*
peut améliorer considérablement les performances, avec les fonctionnalités de INSTR.
SELECT id FROM groups WHERE name ~* 'adm'
retourne les lignes dont le nom contient OR est égal à 'adm'.