PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách thoát chuỗi khi khớp mẫu trong PostgreSQL

Các ký tự _ và% phải được trích dẫn để khớp theo nghĩa đen trong một câu lệnh LIKE, không có cách nào khác. Lựa chọn là thực hiện phía máy khách hoặc phía máy chủ (thường bằng cách sử dụng SQL Replace (), xem bên dưới). Ngoài ra, để hiểu đúng 100% trong trường hợp chung, có một số điều cần xem xét.

Theo mặc định, ký tự trích dẫn được sử dụng trước _ hoặc% là dấu gạch chéo ngược (\), nhưng nó có thể được thay đổi bằng mệnh đề ESCAPE ngay sau mệnh đề LIKE. Trong mọi trường hợp, ký tự trích dẫn phải được lặp lại hai lần trong mẫu để được so khớp theo nghĩa đen dưới dạng một ký tự.

Ví dụ:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' sẽ khớp với john%node1^[email protected] theo sau là bất kỳ thứ gì.

Có vấn đề với lựa chọn mặc định của dấu gạch chéo ngược:nó đã được sử dụng cho các mục đích khác khi standard_conforming_strings TẮT (PG 9.1 đã BẬT theo mặc định, nhưng các phiên bản trước vẫn đang được sử dụng rộng rãi, đây là một điểm cần xem xét).

Ngoài ra, nếu việc trích dẫn cho ký tự đại diện LIKE được thực hiện ở phía máy khách trong tình huống nhập liệu của người dùng, thì nó ngoài đối với trích dẫn chuỗi thông thường đã cần thiết khi người dùng nhập.

Xem qua ví dụ go-pgsql cho biết rằng nó sử dụng trình giữ chỗ kiểu $ N cho các biến ... Vì vậy, đây là một nỗ lực để viết nó theo một cách nào đó chung chung:nó hoạt động với standard_conforming_strings cả BẬT hoặc TẮT, sử dụng thay thế phía máy chủ của [% _], một ký tự trích dẫn thay thế, trích dẫn của ký tự trích dẫn và tránh chèn 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. String -> java.util.Date -> java.sql.Date (có dấu thời gian)

  2. Tại sao truy vấn không được lưu trong tệp csv trong khi nó có vẻ bình thường trong bảng điều khiển postgresql

  3. Một số ý tưởng về tổng hợp tài nguyên cấp thấp trong PostgreSQL

  4. Dự phòng &Dự phòng cho PostgreSQL trên Microsoft Azure

  5. Ruby 'pg' gem liên kết đến bản sao sai của libpq.5.dylib (trên OSX)