当在Postgresql中搜索下划线时,字符_
的字面用法不起作用。例如,如果你想在所有表中搜索以_by
结尾的列,或者像updated_by
、reviewed_by
等更改日志或活动信息,下面的查询几乎可以起作用:
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%_by'
它基本上完全忽略了下划线,并且返回的结果就像您搜索了LIKE '%by'
一样。这可能在所有情况下都不是问题,但它有可能成为一个问题。
3条答案
按热度按时间yjghlzjz1#
您需要使用反斜杠来转义下划线。将示例查询更改为以下内容:
46qrfjad2#
只是遇到了同样的问题,单个反斜杠也不起作用。我在PostgreSQL社区找到了这个文档,它起作用了:
正确的方法是用反斜杠转义下划线。实际上,你必须在查询中写两个反斜杠:
select * from foo where bar like '%\_baz'
第一个反斜杠将查询解析器的第二个反斜杠引起来,这样在系统内部结束的是%_baz,然后LIKE函数知道如何处理它。
因此,使用类似这样的东西:
源文件:https://www.postgresql.org/message-id/10965.962991238%40sss.pgh.pa.us
44u64gxh3#
只是你问题的一个方面有点迂腐:
这是不正确的。这里发生的事情是下划线是postgres的模式匹配支持的另一个通配符。From:https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE
也就是说,如果你曾经使用过DOS通配符,下划线类似于
?
DOS通配符,匹配任何字符,但只能匹配一个字符,而postgres中的%
匹配0个或多个字符-也就是说,%
匹配任何包括空字符串的字符串,但_
匹配任何只有一个字符长的字符串。因此,
WHERE column_name LIKE '%_by'
与WHERE column_name like '%by'
并不完全相同,因为字符串by
不匹配第一个字符串,但匹配第二个字符串(它在by
之前有0个字符,因此不匹配下划线通配符)