使用使用 LIKE 的查询查询左大括号

Posted

技术标签:

【中文标题】使用使用 LIKE 的查询查询左大括号【英文标题】:Querying opening curly brace with queries that are using LIKE 【发布时间】:2018-05-10 17:51:41 【问题描述】:

我们的 Web 应用程序中有一个搜索功能,它使用 Oracle(版本在 Oracle10g 之后),我正在使用 Java 构建 SQL 查询。

根据documentation,您在curly braces .. 中输入的任何内容都会被转义。但是,我也想提供对 的搜索,当我尝试搜索包含 的字符串时,它给了我一个 org.hibernate.QueryException: Unmatched braces for alias path 错误,因为它会查找右大括号。

到目前为止我已经尝试过什么;

...query... WHERE ... LIKE lower('%%') ESCAPE ''

...query... WHERE ... LIKE lower('%\%') ESCAPE '\'

...query... WHERE ... LIKE lower('%%')

...query... WHERE ... LIKE lower('%CHR(123)%')

...query... WHERE ... LIKE lower('%||CHR(123)||%')

前两个仍然导致错误。其他的不会导致任何错误,但它们不会返回包含 的结果。这种情况有什么解决办法吗?

PS:我不能使用准备好的语句,因为查询有图例部分。不幸的是,它必须使用字符串手动构建。

PS2:右大括号没有问题

【问题讨论】:

CHR(123) 应该是这样的:LIKE '%' || CHR(123) || '%'。你在这里绝对不需要LOWER() @David,这个效果非常好。看起来是一个更丑陋的解决方案,但我想我现在会使用它。你周围有没有其他工作知道这种情况? 不,我以前从未见过或听说过这个问题(但我不使用 Hibernate) 【参考方案1】:

LIKE 条件是在没有字符串连接的情况下构造的

...query... WHERE ... LIKE lower('%||CHR(123)||%') -> ...query... WHERE ... LIKE ('%'||CHR(123)||'%')

Env to try this out

【讨论】:

【参考方案2】:

尝试使用REGEXP_LIKE:

select * from (select 'some string contains ' as msg from dual
 union select 'some string without curly braces' as msg from dual) t 
where REGEXP_LIKE(t.msg, '.*[].*')

结果:some string contains

也许我为你的情况写了不正确的正则表达式,但是,至少,你可以用它来查找任何包含的字符串

【讨论】:

很遗憾,我不能使用REGEXP_LIKE。我受限于 LIKE。我想应该有一种 LIKE 方法。 \`, but doc does not say anything for the ` 可以转义反斜杠 我试过这个查询:select * from (select 'some string contains ' as msg from dual union select 'some string without curly braces' as msg from dual) t where t.msg like '%%',它也有效。也许这取决于 oracle 版本

以上是关于使用使用 LIKE 的查询查询左大括号的主要内容,如果未能解决你的问题,请参考以下文章

JSON格式要求

c ++预期的左大括号以及重新定义错误

Clang-format 语法在自己的行上获取初始化程序左大括号

编程规范

java开发手册-编程规约-代码格式

动态 Active Record 查询中的 Codeigniter 括号