sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man undslipper sträng medan man matchar mönster i PostgreSQL

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);


  1. Vilka är mer presterande, CTE eller temporära tabeller?

  2. (engelska) Hur man använder Oracle Database 19c Pre-Built Developer VM

  3. Hur man hämtar ett OBJECT_NAME() från en annan databas i SQL Server

  4. SQL Server ROWCOUNT_BIG()