2014-07-10 116 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版本有三個參數,這就是爲什麼我需要它。 –