使用使用 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 的查询查询左大括号的主要内容,如果未能解决你的问题,请参考以下文章