如何在PostgreSQL中转义下划线

7fhtutme  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(373)

当在Postgresql中搜索下划线时,字符_的字面用法不起作用。例如,如果你想在所有表中搜索以_by结尾的列,或者像updated_byreviewed_by等更改日志或活动信息,下面的查询几乎可以起作用:

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

它基本上完全忽略了下划线,并且返回的结果就像您搜索了LIKE '%by'一样。这可能在所有情况下都不是问题,但它有可能成为一个问题。

yjghlzjz

yjghlzjz1#

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

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

46qrfjad2#

只是遇到了同样的问题,单个反斜杠也不起作用。我在PostgreSQL社区找到了这个文档,它起作用了:
正确的方法是用反斜杠转义下划线。实际上,你必须在查询中写两个反斜杠:
select * from 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

44u64gxh

44u64gxh3#

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

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

这是不正确的。这里发生的事情是下划线是postgres的模式匹配支持的另一个通配符。From: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个字符,因此不匹配下划线通配符)

相关问题