如何在Postgresql中转义下划线

Joe*_*e M 19 postgresql escaping wildcard postgresql-9.3

在Postgresql中搜索下划线时,字符的字面使用_不起作用.例如,如果你想搜索该结束了在任何列所有的表_by,这样的事情更改日志或活动信息,例如updated_by,reviewed_by等等,下面的查询工作差不多:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%_by'
Run Code Online (Sandbox Code Playgroud)

它基本上完全忽略了下划线并返回,就像你搜索了一样LIKE '%by'.这在所有情况下都可能不是问题,但它有可能成为一个问题.如何搜索下划线?

Joe*_*e M 22

你需要使用反斜杠来逃避下划线.将示例查询更改为以下内容:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\_by'
Run Code Online (Sandbox Code Playgroud)

  • 我必须做`...就像E'%\\ _ by'`(在命令行上使用psql,PostgreSQL 8.4.20) (5认同)
  • @BradCupit:这很奇怪,我必须在 PostgreSQL 9.5 中执行 `E'%\_by'` 。 (2认同)

Tay*_*r D 8

刚遇到同样的问题,单个反斜杠也不起作用。我在 PostgreSQL 社区上找到了这个文档并且它有效:

正确的方法是用反斜杠转义下划线。您实际上必须在查询中写入两个反斜杠:

select * from foo where bar like '%\\_baz'

第一个反斜杠引用查询解析器的第二个反斜杠,因此系统内部最终是 %\_baz,然后 LIKE 函数知道如何处理它。

因此使用这样的东西:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\\_by'
Run Code Online (Sandbox Code Playgroud)

源文档:https : //www.postgresql.org/message-id/10965.962991238%40sss.pgh.pa.us