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
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'. –
Cela semble intéressant Wiktor, comment puis-je l'utiliser dans une déclaration SQL? – Fidel
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 :) –