如何为数据库查找创建变量模式匹配?

时间:2014-01-21 11:12:07

标签: java database hibernate postgresql named-query

我想找一个表格行,其中所需的值的格式为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我可以将字母作为可变参数提供?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用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

答案 1 :(得分: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将字母连接成正确的正则表达式。

答案 2 :(得分:0)

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

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