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];
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.
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.*';
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.
with help(term) as (values('T%'),('STAG%'))
select tabschema, tabname
from syscat.indexes
where not exists (select 1 from help where tabschema like term)