2014-07-10 52 views
2

我有一个查询被写入在Oracle数据库上运行,该数据库使用函数REGEXP_LIKE来过滤查询中的一些行。具体函数调用H2无法识别正则表达式like

regexp_like(col1, '[^[:alpha:]]') 

问题是,当我在H2运行查询,我得到以下错误:

org.h2.jdbc.JdbcSQLException: Function "REGEXP_LIKE" not found 

如果我直接在Oracle数据库上使用的SQLDeveloper工具它运行查询按预期返回。

任何想法可能导致这种情况?

+0

是你所需要的问题查询在Oracle和H2上运行? –

回答

6

查看excellent documentation

col REGEXP '[^[:alpha:]]' 

通常,SQL变体要么使用函数,要么使用命名操作符。

以上具体的正则表达式的工作是否我不知道。一个应该能够依靠java正则表达式。

4

H2没有称为regexp_like的功能。但你可以使用创建一个user defined function

create alias regexp_like as 
$$ boolean regexpLike(String s, String p) { return s.matches(p); } $$; 

drop table test; 
create table test(id int, name varchar(2555)); 
insert into test values(1, 'Steven'); 
insert into test values(2, 'Stefan'); 
select * from test where regexp_like(name, '^Ste(v|ph)en$'); 
1

下面是支持的标志和NULL值托马斯·穆勒的H2用户功能的略微改进版:

create alias regexp_like as 
$$ boolean regexpLike(String s, String p, String flags) { 
    if(null == s) return false; 
    if(null != flags) { p = "(?" + flags + ")" + p; } 
    java.util.regex.Pattern compiled = java.util.regex.Pattern.compile(p); 
    return compiled.matcher(s).find(); 
} $$ 
+0

'flags'参数似乎是多余的。调用者可以直接在模式中传递标志。 – Stephan

+0

@Stephan:Oracle版本有三个参数,这就是为什么我需要它。 –