web-dev-qa-db-fra.com

Où la colonne n'aime pas plusieurs valeurs

J'essaie de sélectionner des enregistrements dans une base de données postgresql où le nom d'utilisateur n'est pas comme une liste de chaînes.

SELECT * FROM Rails_db WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';

Le problème est qu'il y a beaucoup de ces valeurs. Existe-t-il un moyen de créer un tableau de ceux-ci et de dire quelque chose comme:

SELECT * FROM Rails_db WHERE username NOT LIKE ARRAY[my values];
8
Jeff

Vous aviez presque la syntaxe correcte. C'est exactement ce que vous voulez:

SELECT * FROM Rails_db WHERE username NOT LIKE ALL(ARRAY[my values]);

C'est une syntaxe très agréable, mais elle ne sera pas nécessairement rapide, surtout pas si le tableau est grand. Cependant, ce que vous voulez est difficile à optimiser pour les performances, et il n'y a aucune raison de penser que les syntaxes les plus laides seront plus rapides.

12
jjanes

Je l'ai peut-être trouvé, mais je veux voir si cela fonctionne comme il est censé:

SELECT * FROM Rails_db WHERE username !~* 'j.*|.*eepy.*';
1
Jeff

Votre idée d'utiliser une expression régulière avec des branches est solide. Mais dans votre réponse vous avez obtenu la traduction du caractère spécial % dans LIKE motifs incorrects.

Cette:

... WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';

se traduit par:

... WHERE username !~ '^j|eepy';

!~ est sensible à la casse comme NOT LIKE.
Utilisation !~* pour correspondre à la casse comme NOT ILIKE.
Pour exclure également les chaînes contenant un point (.) n'importe où et avec un autre exemple qui correspond (ne correspond pas) à la fin de la chaîne comme username NOT LIKE '%end':

... WHERE username !~ '^j|end$|eepy|\.';

Probablement pas très rapide non plus.

1
Erwin Brandstetter
with help(term) as (values('T%'),('STAG%'))
select tabschema, tabname
from syscat.indexes
where not exists (select 1 from help where tabschema like term)
0
Jürgen Götz