Apache Derby 中的正则表达式

标签 regex stored-procedures derby

是否可以从 Apache Derby 中的 varchar 字段中提取字符串?

我想使用正则表达式。像这样的东西:

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

最佳答案

Apache Derby 没有 native 函数,但可以创建您自己的函数并从数据库中调用它。

首先,创建将处理正则表达式的 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;
    }
}

然后通过在数据库上运行以下sql语句将jar文件注入(inject)到数据库中:

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

现在通过运行以下 sql 语句在数据库中创建存储过程:

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

关于Apache Derby 中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369703/

相关文章:

java - Apache Derby 中的 REPLACE 函数

SQL 对一个表中的列进行配对

regex - 为什么这个正则表达式单元测试失败?

javascript - 在 unicode 问题上用正则表达式替换/替换所有

regex - 正则表达式:验证带有多个分隔符的欧洲日期格式

c# - 以编程方式获取所有存储过程的简单方法

javascript - (?=) 没用,我只是改变了它的位置

java - 如何在 JPA 应用程序中进行定期数据库清理?

mysql - 复杂的MySQL数据结构/操作问题

java - 为什么数据源在没有数据库 URL 的情况下也能正常工作?