Tecknen _ och % måste citeras för att matchas bokstavligt i ett LIKE-uttryck, det finns ingen väg runt det. Valet handlar om att göra det på klientsidan eller serversidan (vanligtvis genom att använda SQL replace(), se nedan). För att få det 100% rätt i det allmänna fallet finns det några saker att tänka på.
Som standard är citattecknet som ska användas före _ eller % bakstrecket (\), men det kan ändras med en ESCAPE-sats omedelbart efter LIKE-satsen. I vilket fall som helst måste citattecknet upprepas två gånger i mönstret för att matchas bokstavligen som ett tecken.
Exempel:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^'
skulle matcha john%node1^[email protected] följt av vad som helst.
Det finns ett problem med standardvalet av snedstreck:det används redan för andra ändamål när standard_conforming_strings är AV (PG 9.1 har det PÅ som standard, men tidigare versioner är fortfarande i stor användning, detta är en punkt att överväga).
Om citeringen för LIKE jokertecken görs på klientsidan i ett scenario för inmatning av användarinmatning, kommer det utöver till den normala sträng-citering som redan behövs vid användarinmatning.
En blick på ett go-pgsql-exempel visar att den använder platshållare i $N-stil för variabler... Så här är ett försök att skriva det på ett generellt sätt:det fungerar med standard_conforming_strings både PÅ eller AV, använder serversidesersättning av [%_], ett alternativt citattecken, citat av citattecknet och undviker sql-injektion:
db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
variable_user_input);