2016-07-14 1 views
2

Est-il possible d'extraire une chaîne d'un champ varchar dans Apache Derby?Regex dans Apache Derby

J'aimerais utiliser une expression régulière. Quelque chose comme:

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

Vous pourriez être en mesure d'extraire les pièces avec ' 'Joe Bloggs'.replaceAll (" (\ w +) \ s \ w + "," $ 1 ")' (pour obtenir 'Joe') et' 'Joe Bloggs'.replaceAll (" \ w + \ s (\ w +) "," $ 2 ")' pour obtenir 'Bloggs'. –

+0

Cela semble intéressant Wiktor, comment puis-je l'utiliser dans une déclaration SQL? – Fidel

+0

Aucune idée, je viens de jeter un oeil à http://stackoverflow.com/questions/12075355/search-java-string-for-special-characters-before-inserting-into-derbydb-varcha, et a suggéré une approche similaire ici :) –

Répondre

3

Apache Derby ne dispose pas d'une fonction native, mais il est possible de créer votre propre et l'appeler à partir de la base de données.

d'abord, créez la méthode java qui traitera l'expression régulière:

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; 
    } 
} 

Injecter le fichier jar dans la base de données en exécutant l'instruction SQL suivante sur la base de données:

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'); 

maintenant créez la procédure stockée dans la base de données en exécutant l'instruction sql suivante:

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'; 

Maintenant, vous pouvez lancer votre requête:

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

qui retourne:

Bloggs