Also habe ich eine in meinem Postgresql:
TAG_TABLE
==========================
id tag_name
--------------------------
1 aaa
2 bbb
3 ccc
Um mein Problem zu vereinfachen, möchte ich 'id' aus TAG_TABLE AUSWÄHLEN, wenn eine Zeichenfolge "aaaaaaaa" den 'tag_name' enthält. Im Idealfall sollte nur "1" zurückgegeben werden. Dies ist die ID für den Tag-Namen "aaa".
Das mache ich bisher:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'
Dies funktioniert jedoch offensichtlich nicht, da die Postgres der Ansicht sind, dass '% tag_name%' ein Muster bedeutet, das den Teilstring 'tag_name' anstelle des tatsächlichen Datenwerts unter dieser Spalte enthält.
Wie übergebe ich den Tag-Namen an das Muster?
sql
postgresql
user2436815
quelle
quelle
"; drop table TAG_TABLE; --"
?WHERE
Klausel als ausgewertet wirdFALSE
. Die Anweisung ist nicht dynamisch, nur Werte werden verkettet, keine Chance für SQL-Injection.LIKE
Schlüsselworts stehen muss.LIKE
Muster unbeabsichtigte Folgen haben kann, wenn diese Variablen Unterstriche (_) oder Prozentzeichen (%) enthalten. Es kann erforderlich sein, diese Zeichen zuCREATE OR REPLACE FUNCTION quote_for_like(text) RETURNS text LANGUAGE SQL IMMUTABLE AS $$ SELECT regexp_replace($1, '([\%_])', '\\\1', 'g'); $$;
maskieren , beispielsweise mit folgender Funktion: (vom Benutzer MatheusOl aus dem IRC-Kanal #postgresql auf Freenode).Ich persönlich bevorzuge die einfachere Syntax des Operators ~.
Es lohnt sich, den Unterschied zwischen LIKE und ~ in Postgres durchzulesen , um den Unterschied zu verstehen. `
quelle
tag_name
es sich um einen richtigen REGEX handelt. Ziemlich riskant.***=
wird in postgresql.org/docs/current/static/functions-matching.html erwähnt . Ich habe jedoch festgestellt, dass dies im Vergleich zu denstrpos
/position
-Lösungen zu viel langsamer ist .Ein richtiger Weg für eine Teilkette zu suchen , ist die Verwendung
position
Funktion anstelle vonlike
Ausdruck, die Flucht erfordert%
,_
und ein Escape - Zeichen (\
Standardeinstellung):quelle
LIKE
undILIKE
kanngin
Indizes verwenden.position
kann nicht.Neben der Lösung mit
'aaaaaaaa' LIKE '%' || tag_name || '%'
gibt esposition
(umgekehrte Reihenfolge der Argumente) undstrpos
.Abgesehen davon, was effizienter ist (LIKE sieht weniger effizient aus, aber ein Index kann die Dinge ändern), gibt es ein sehr kleines Problem mit LIKE: tag_name sollte natürlich nicht enthalten
%
und insbesondere_
(Platzhalter mit einem Zeichen ), um keine falsch positiven Ergebnisse zu liefern.quelle
tag_name
sollte in Anführungszeichen stehen, sonst wird ein Fehler ausgegeben, da tag_name nicht vorhanden istquelle