PostgreSQL含特殊字符查询问题:如何将'|'视为普通字符
解决PostgreSQL正则匹配中把|当作普通字符的问题
你的问题出在PostgreSQL的正则表达式语法里,|是代表“或”的元字符,所以原查询实际是在匹配词首的Founder of JoJoWorld或者词首的Python,而不是包含完整Founder of JoJoWorld | Python的内容。要把|当作普通字符处理,有两种实用方法:
方法1:手动转义特殊字符
如果查询文本是固定的,直接把|转义成\\|(因为SQL字符串里反斜杠需要额外转义),修改后的查询代码如下:
SELECT * FROM "main_parse_user" WHERE ("main_parse_user"."bio"::text ~* '\mFounder of JoJoWorld \| Python' OR "main_parse_user"."first_name"::text ~* '\mFounder of JoJoWorld \| Python')
这样正则引擎就会把|当作普通的竖线字符处理,只会匹配包含完整目标字符串的内容。
方法2:自动转义所有正则元字符
如果查询文本是动态生成(比如来自用户输入),不确定会包含哪些正则特殊字符(比如.、*、?等),可以用regexp_replace自动转义所有元字符,这样不管有没有特殊字符都能正常匹配:
-- 假设$search_text是你的查询文本变量 SELECT * FROM "main_parse_user" WHERE ( "main_parse_user"."bio"::text ~* '\m' || regexp_replace($search_text, '([\^\$\.\*\+\?\(\)\[\]\{\}\|\\])', '\\\1', 'g') OR "main_parse_user"."first_name"::text ~* '\m' || regexp_replace($search_text, '([\^\$\.\*\+\?\(\)\[\]\{\}\|\\])', '\\\1', 'g') )
这个方法会把所有正则元字符都转义成普通字符,既解决了|的问题,也能兼容没有特殊字符的查询文本。
内容的提问来源于stack exchange,提问作者Qadyr Israfilov
相关产品推荐
相关产品推荐

