在做WEB项目时, 经常会需要使用搜索功能, 而且大多数时候是需要模糊搜索, 以下将对模糊搜索进行介绍:
通常我们是这样写的:
SELECT * FROM 表名 WHERE 字段 LIKE ('%' || '关键字' || '%')
或者这样写:
SELECT * FROM 表名 WHERE 字段 ~* '关键字'
但是这两种是有风险的!
可能出现的问题:
invalid regular expression: quantifier operand invalid
出现原因: 使用 ~* 符号进行模糊查询时, 关键字使用 *
invalid regular expression: invalid escape \ sequence``
出现原因: 使用 ~* 符号进行模糊查询时, 关键字使用 \
等等各种因为特殊符号产生的问题, 不一一举例了
类似的, 使用特殊符号作为关键字时, 就会出现类似的报错问题.
所以, 既是模糊搜索,搜索的内容又允许带有特殊符号的时候, 就必须对此情况进行处理!
解决方案:
同事们经过摸索, 研究出来的超厉害的解决方案:
SELECT * FROM 表名 WHERE 字段 ILIKE regexp_replace(concat('%','关键字','%'),'\\','\\\','g')
经过测试, 你在关键字内输入任何特殊符号, 都能正常的进行查询!