如何在 Postgresql 中转义下划线

问题描述 投票:0回答:3

在 Postgresql 中搜索下划线时,字面使用字符

_
不起作用。例如,如果您想在所有表中搜索以
_by
结尾的任何列,例如更改日志或活动信息,例如
updated_by
,
reviewed_by
等,下面的查询几乎可以工作:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%_by'

它基本上完全忽略下划线并返回,就好像您搜索了

LIKE '%by'
一样。在所有情况下这可能都不是问题,但它有可能成为一个问题。如何搜索下划线?

postgresql wildcard
3个回答
69
投票

您需要使用反斜杠来转义下划线。将示例查询更改为以下内容:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\_by'

12
投票

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

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

从中选择* foo where bar like '%\_baz'

第一个反斜杠引用了查询解析器的第二个反斜杠,所以 系统内部最终出现的是 %\_baz,然后是 LIKE 函数知道该怎么做。

因此使用这样的东西:

SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%\\_by'

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


0
投票

只是对你问题的一个方面的迂腐点:

It basically ignores the underscore completely and returns as if you'd searched for LIKE '%by'.

这是不正确的。这里发生的事情是下划线是 postgres 模式匹配支持的另一个通配符。来自:https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE

An underscore (_) in pattern stands for (matches) any single character; a percent sign (%) matches any sequence of zero or more characters.

即如果您曾经使用过 DOS 通配符,下划线类似于

?
DOS 通配符,匹配任何字符,但恰好匹配一个字符,而 postgres 中的
%
匹配 0 个或多个字符 - 即
%
匹配任何包含空字符串的字符串,但
_
匹配任何恰好一个字符长的字符串。

因此,

WHERE column_name LIKE '%_by'
WHERE column_name like '%by'
不完全相同,因为字符串
by
不匹配第一个但匹配第二个(它在
by
之前有 0 个字符,因此不匹配下划线通配符)

© www.soinside.com 2019 - 2024. All rights reserved.