如何从SQL LIKE子句中转义特殊字符?

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

我正在使用https://www.baeldung.com/rest-api-search-language-rsql-fiql处的指南来构建基于RSQL的JPA规范。

like子句如下所示:

return builder.like(root.get(property), argument.toString().replace('*', '%'));

我的问题是,处理用户输入中转义特殊字符的最佳方法是什么?

例如,如果用户提供了字符串:

*my-search%-term*

上面的代码会将其翻译为:

%my-search%-term%

我想对字符串中的%进行转义,以便在LIKE子句中不将其评估为%通配符。

以下文章陈述了每个数据库的LIKE特殊字符:

List of special characters for SQL LIKE clause

并且还要注意答案之一中的comment

这里不可能编写独立于DBMS的代码,因为您不会知道您将要转义哪些字符,以及标准说你无法逃避不需要逃避的事情。 (看到第8.5节/一般规则/3.a.ii。)]

我想知道解决这个问题的最佳方法是什么?我在生产中使用了postgres,在测试中使用了h2,但理想情况下不希望将解决方案与这两个方法绑定在一起。

java sql postgresql special-characters sql-like
2个回答
0
投票

为什么不使用正则表达式匹配而不是like

where col ~ <user input>

听起来您的用户可能对正则表达式更为熟悉。

如果您只想忽略所有通配符功能的完全匹配,则可以使用位置:

where position(<user input> in col) > 0

0
投票

在标准SQL中,您只需要转义%_字符,因为这些字符是LIKE运算符支持的唯一通配符。

因此*my-search%-term*应该在SQL中像这样使用

WHERE some_column LIKE '%my-search\%-term%' escape '\'
© www.soinside.com 2019 - 2024. All rights reserved.