【问题标题】:Querying opening curly brace with queries that are using LIKE使用使用 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)

标签: java sql oracle escaping


【解决方案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 版本
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2012-09-24
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2016-08-12
    相关资源
    最近更新 更多