【问题标题】:How to create variable pattern matching for database lookup?如何为数据库查找创建变量模式匹配?
【发布时间】:2014-01-21 11:12:07
【问题描述】:

我想找到一个表格行,其中所需值的形式为A9-B19-C12-D1。因此,可变字母后跟可变数字,分别由- 分隔。长度不固定,例如也可以只有A9A9-D1

我只关心字母。现在我有 4 个字母 A, B, C, D,我想对 postgres db 运行一个查询,是否存在上述格式的条目。

我会用下面的语句来做吗?

SELECT * FROM mytable t WHERE t.entry LIKE 'A%B%C%D%';

如果这是正确的:我如何制定一个NamedQuery,我可以在其中提供字母作为变量参数?

【问题讨论】:

  • 退后一步,我首先要问,为什么有一列具有这样的子结构。根据用例,重新考虑表设计而不是在这里执行非常低效的 LIKE 查询可能是有意义的。只是我的两分钱:)

标签: java database hibernate postgresql named-query


【解决方案1】:

尝试将SIMILAR TO与正则表达式A\d+(-B\d+(-C\d+(-D\d+)?)?)?一起使用

@NamedNativeQueries({
    @NamedNativeQuery(
    name = "finDesiredData",
    query = "select * from mytable t where t.entry SIMILAR TO :ent",
        resultClass = MyTable.class
    )
})

我个人会使用 java StringBuffer 将字母连接成正确的正则表达式。

【讨论】:

  • 我前段时间有人向我指出similar to 在技术上是标准的,但许多其他数据库并未实现​​,它被 Pg 转换为真正的正则表达式,并且通常不是很好。最好先使用 PCRE 和 ~ 运算符。
【解决方案2】:

您可以尝试在 PostgreSQL 中使用 regexp_replace 函数。 本质上,使用select regexp_replace('A9-B19-C12-D1', '[0-9]|-', '','g') as letters 会返回一个字符串ABCD

同样,select regexp_replace('A9-D1', '[0-9]|-', '','g') 返回AD

使用这些信息,您可以编写以 regexp_replace 函数输出为条件的查询。即SELECT * FROM mytable t WHERE regexp_replace(t.entry, '[0-9]|-', '','g')='ABCD' ;

我相信您也可以在其函数输出上为表列编制索引 - 但我会将其留给您研究。您还可以查看使用SQL Functions Returning Sets 用户定义的函数(我认为这就是您所说的命名查询)。

SQL Fiddle example

【讨论】:

    【解决方案3】:

    嗯,我不知道我是否理解你的问题,但你可以像这样设置namedQuery:

    query.setParamter("param1", "%" + 9 + "%");
    query.setParamter("param2", "%" + 1 + "%");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2012-08-04
      • 2012-06-27
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多