2016-07-14 5 views
2

Возможно ли извлечь строку из поля varchar в Apache Derby?Regex in Apache Derby

Я хотел бы использовать регулярное выражение. Что-то вроде:

select 
    regex('Joe Bloggs', '(\w+)\s(\w+)', 2) as surname 
from SYSIBM.SYSDUMMY1 
+0

Вы можете быть в состоянии извлечь части с ' 'Джо Bloggs'.replaceAll (" (\ W +) \ s \ ш + "," $ 1 ")' (чтобы получить 'Joe') и' 'Joe Bloggs'replaceAll ("\ w + \ s (\ w +)", "$ 2") ', чтобы получить' Bloggs'. –

+0

Это выглядит интересным Wiktor, как я могу использовать это в инструкции sql? – Fidel

+0

Не знаю, я просто посмотрел на http://stackoverflow.com/questions/12075355/search-java-string-for-special-characters-before-inserting-into-derbydb-varcha и предложил аналогичный подход здесь :) –

ответ

3

Apache Derby не имеет собственной функции, но это возможно, чтобы создать свой собственный и вызвать его из базы данных.

Во-первых, создать метод Java, который будет обрабатывать регулярное выражение:

package DbExamples.StoredProcedures; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StringUtilities { 

    public static String regex(String source, String regex, int index) { 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(source); 

     String result = null; 
     if (matcher.find()) { 
      if (matcher.groupCount() >= index) { 
       result = matcher.group(index); 
      } 
     } 

     return result; 
    } 
} 

Затем впрыснуть .jar файл в базу данных, выполнив следующую инструкцию SQL в базе данных:

CALL SQLJ.REMOVE_JAR('App.StoredProcedures', 0); 
CALL SQLJ.INSTALL_JAR('C:\dev\DbExamples\dist\DbExamples.jar', 'App.StoredProcedures', 0); 
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'App.StoredProcedures'); 

сейчас создайте хранимую процедуру в базе данных, запустив следующую инструкцию:

drop function regex; 
create function regex(sourceString varchar(8000), regex varchar(8000), index int) 
returns varchar(8000) 
parameter style java no sql 
language java external name 'DbExamples.StoredProcedures.StringUtilities.regex'; 

Теперь вы можете запустить свой запрос:

select 
    regex('Joe Bloggs', '(\w+)\s(\w+)', 2) as surname 
from SYSIBM.SYSDUMMY1 

который возвращает:

Bloggs 

 Смежные вопросы

  • Нет связанных вопросов^_^