我想找一个表格行,其中所需的值的格式为A9-B19-C12-D1
。因此,变量字母后跟可变数字,每个字符由-
分隔。长度不固定,例如它也可能只有A9
或A9-D1
。
我只关心这些信件。现在我有4个字母A, B, C, D
,我想对postgres
db运行一个查询,表明上面的格式有一个条目。
我是否会使用以下声明执行此操作?
SELECT * FROM mytable t WHERE t.entry LIKE 'A%B%C%D%';
如果这是正确的:我如何制定NamedQuery
我可以将字母作为可变参数提供?
答案 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用户定义的函数(我认为这就是命名查询的含义)。
答案 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 + "%");