J'ai donc un dans mon Postgresql:
TAG_TABLE
==========================
id tag_name
--------------------------
1 aaa
2 bbb
3 ccc
Pour simplifier mon problème, ce que je veux faire est de SELECT 'id' dans TAG_TABLE lorsqu'une chaîne "aaaaaaaa" contient le "tag_name". Donc, idéalement, il ne devrait renvoyer que "1", qui est l'ID du nom de balise 'aaa'
C'est ce que je fais jusqu'à présent:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'
Mais évidemment, cela ne fonctionne pas, puisque le postgres pense que «% tag_name%» signifie un modèle contenant la sous-chaîne «tag_name» au lieu de la valeur réelle des données sous cette colonne.
Comment passer le tag_name au motif ??
sql
postgresql
user2436815
la source
la source
"; drop table TAG_TABLE; --"
?WHERE
clause est évaluée àFALSE
. L'instruction n'est pas dynamique, seules les valeurs sont concaténées, aucune chance d'injection SQL.LIKE
mot - clé.LIKE
modèle peut avoir des conséquences inattendues lorsque ces variables contiennent des traits de soulignement (_) ou des pourcentages (%). Il peut être nécessaire d'échapper à ces caractères, par exemple avec cette fonction:CREATE OR REPLACE FUNCTION quote_for_like(text) RETURNS text LANGUAGE SQL IMMUTABLE AS $$ SELECT regexp_replace($1, '([\%_])', '\\\1', 'g'); $$;
(de l'utilisateur MatheusOl du canal IRC #postgresql sur Freenode).Personnellement, je préfère la syntaxe plus simple de l'opérateur ~.
Il vaut la peine de lire Différence entre LIKE et ~ dans Postgres pour comprendre la différence. »
la source
tag_name
s'agit d'un REGEX approprié. Assez risqué.***=
qui est mentionné dans postgresql.org/docs/current/static/functions-matching.html . Cependant, j'ai trouvé que c'était beaucoup plus lent que lesstrpos
/position
solutions.Une bonne façon de rechercher une sous-chaîne est d'utiliser une
position
fonction au lieu d'unelike
expression, qui nécessite un échappement%
,_
et un caractère d'échappement (\
par défaut):la source
LIKE
etILIKE
peut utiliser desgin
indices.position
ne peux pas.En plus de la solution avec,
'aaaaaaaa' LIKE '%' || tag_name || '%'
il y aposition
(ordre inverse des args) etstrpos
.Outre ce qui est plus efficace (LIKE semble moins efficace, mais un index peut changer les choses), il y a un problème très mineur avec LIKE: tag_name bien sûr ne doit pas contenir
%
et surtout_
(caractère générique unique), pour ne pas donner de faux positifs.la source
tag_name
devrait être entre guillemets sinon cela donnera une erreur car tag_name n'existe pasla source