PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak uciec z ciągu znaków podczas dopasowywania wzorca w PostgreSQL?

Znaki _ i % muszą być ujęte w cudzysłów, aby pasowały dosłownie w instrukcji LIKE, nie można tego obejść. Wybór dotyczy zrobienia tego po stronie klienta lub po stronie serwera (zazwyczaj przy użyciu metody SQL replace(), patrz poniżej). Aby uzyskać 100% prawidłowy wynik w ogólnym przypadku, należy wziąć pod uwagę kilka rzeczy.

Domyślnie znakiem cudzysłowu używanym przed _ lub % jest ukośnik odwrotny (\), ale można go zmienić za pomocą klauzuli ESCAPE znajdującej się bezpośrednio po klauzuli LIKE. W każdym przypadku znak cudzysłowu musi zostać powtórzony dwukrotnie we wzorcu do być dopasowane dosłownie jako jeden znak.

Przykład:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' pasuje do john%node1^[email protected] po którym następuje cokolwiek.

Istnieje problem z domyślnym wyborem odwrotnego ukośnika:jest on już używany do innych celów, gdy standard_conforming_strings jest WYŁĄCZONY (PG 9.1 ma je domyślnie WŁĄCZONE, ale poprzednie wersje są nadal powszechnie używane, warto to rozważyć).

Również jeśli cytowanie dla symbolu wieloznacznego LIKE jest wykonywane po stronie klienta w scenariuszu wstrzykiwania danych wejściowych przez użytkownika, jest to oprócz do normalnego cudzysłowu, który jest już potrzebny podczas wprowadzania danych przez użytkownika.

Rzut oka na przykład go-pgsql mówi, że używa symboli zastępczych w stylu $N dla zmiennych... Więc tutaj jest próba napisania tego w jakiś ogólny sposób:działa z standard_conforming_strings zarówno ON, jak i OFF, używa zamiany po stronie serwera [%_], alternatywny znak cudzysłowu, cytowanie znaku cudzysłowu i unikanie wstrzykiwania sql:

   db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
     variable_user_input);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INITCAP() – Konwertuj na litery początkowe w PostgreSQL

  2. Jak zbiorczo wstawiać tylko nowe wiersze w PostreSQL

  3. GroupingError:ERROR:kolumna musi występować w klauzuli GROUP BY lub być używana w funkcji agregującej

  4. Jak przekonwertować uniksowy znacznik czasu na wartość daty/godziny w PostgreSQL?

  5. Jak skonfigurować PostgreSQL, aby akceptował wszystkie połączenia przychodzące?