Java实现Mysql数据库中 substring_index函数

前言: 由于hive中没有这个 substring_index函数,所以就自定义一个udf函数来调用使用。(不通过hive使用时可以直接使用下方的代码,如果需要被hive使用 记得继承 UDF类)

主要方法:  indexOf(str, position); // str 查找的字符串,position 匹配字符串的开始位置

MysqlSubStringIndex.java

package com.mysql.util;
/**
* <p>Description:实现mysql的 substring_index(str,str,int) 函数功能 </p>
* @author duanfeixia
* @date 2019年7月3日
*/
public class MysqlSubStringIndex { /**
*
* @param targetStr
* 目标字符串
* @param str
* 查找字符串
* @param index
* 第n次出现
* @param order
* 顺序(大于0表示正序,小于0表示反序)
* @return
*/
public static String evaluate(String targetStr, String str, int index, int order) {
/**
* 当 str 不存在于 targetStr 时,不管是正序还是反序都返回原字符串
* 当index大于 str 在 targetStr 中出现的次数,不管是正序还是反序都返回原字符串
*/
String result = targetStr;//默认返回字符串为原字符串 if (targetStr == null || targetStr.trim().length() == 0) {
return result;
} //当index=0时,返回空
if(index == 0){
return "";
} //判断是正序还是反序(大于等于0表示正序,小于0表示反序)
if(order < 0){
targetStr = new StringBuffer(targetStr).reverse().toString();
} int beginIndex = 0;//用于匹配字符串的起始位置
int count = 0; //记录字符串出现的次数
while ((beginIndex = targetStr.indexOf(str, beginIndex)) != -1) {
count++;
//当index与字符串出现次数相同时,开始返回结果
if (count == index) {
if (order < 0) {//反序时
targetStr = new StringBuffer(targetStr).reverse().toString();
result = targetStr.substring(targetStr.length() - beginIndex);
}else{//正序时
result = targetStr.substring(0, beginIndex);
}
return result;
}
beginIndex = beginIndex + str.length();//更改匹配字符串的起始位置
}
return result;
} //测试
public static void main(String[] args) {
String result11 = evaluate("ehello.wolrd.1ee", "e", 1,1);
String result21 = evaluate("ehello.wolrd.1ee", "e", 2,1);
String result31 = evaluate("ehello.wolrd.1ee", "e", 3,1);
String result41 = evaluate("ehello.wolrd.1ee", "e", 4,1);
String result51 = evaluate("ehello.wolrd.1ee", "e", 5,1); String result1 = evaluate("ehello.wolrd.1ee", "e", 1,-1);
String result2 = evaluate("ehello.wolrd.1ee", "e", 2,-1);
String result3 = evaluate("ehello.wolrd.1ee", "e", 3,-1);
String result4 = evaluate("ehello.wolrd.1ee", "e", 4,-1);
String result5 = evaluate("ehello.wolrd.1ee", "e", 5,-1); System.out.println("正序-result11= "+result11);
System.out.println("正序-result21= "+result21);
System.out.println("正序-result31= "+result31);
System.out.println("正序-result41= "+result41);
System.out.println("正序-result51= "+result51); System.out.println("---------------------------"); System.out.println("反序-result1= "+result1);
System.out.println("反序-result2= "+result2);
System.out.println("反序-result3= "+result3);
System.out.println("反序-result4= "+result4);
System.out.println("反序-result5= "+result5); System.out.println("---------------------------"); String result = evaluate("ehello.wolrd.1ee", "e", 0,-1);
System.out.println("index=0时-result= "+result); }
}

  

测试结果:

Hive中UDF函数定义,继承了UDF类 

package com.mysql.util.hiveudf;

import org.apache.hadoop.hive.ql.exec.UDF;

/**
* <p>Description:实现mysql的 substring_index(str,str,int) 函数功能 </p>
* @author duanfeixia
* @date 2019年7月3日
*/
public class MysqlSubStringIndex extends UDF{ /**
*
* @param targetStr
* 目标字符串
* @param str
* 查找字符串
* @param index
* 第n次出现
* @param order
* 顺序(大于0表示正序,小于0表示反序)
* @return
*/
public static String evaluate(String targetStr, String str, int index, int order) {
/**
* 当 str 不存在于 targetStr 时,不管是正序还是反序都返回原字符串
* 当index大于 str 在 targetStr 中出现的次数,不管是正序还是反序都返回原字符串
*/
String result = targetStr;//默认返回字符串为原字符串 if (targetStr == null || targetStr.trim().length() == 0) {
return result;
} //当index=0时,返回空
if(index == 0){
return "";
} //判断是正序还是反序(大于等于0表示正序,小于0表示反序)
if(order < 0){
targetStr = new StringBuffer(targetStr).reverse().toString();
} int beginIndex = 0;//用于匹配字符串的起始位置
int count = 0; //记录字符串出现的次数
while ((beginIndex = targetStr.indexOf(str, beginIndex)) != -1) {
count++;
//当index与字符串出现次数相同时,开始返回结果
if (count == index) {
if (order < 0) {//反序时
targetStr = new StringBuffer(targetStr).reverse().toString();
result = targetStr.substring(targetStr.length() - beginIndex);
}else{//正序时
result = targetStr.substring(0, beginIndex);
}
return result;
}
beginIndex = beginIndex + str.length();//更改匹配字符串的起始位置
}
return result;
} public static void main(String[] args) {
String result11 = evaluate("ehello.wolrd.1ee", "e", 1,1);
String result21 = evaluate("ehello.wolrd.1ee", "e", 2,1);
String result31 = evaluate("ehello.wolrd.1ee", "e", 3,1);
String result41 = evaluate("ehello.wolrd.1ee", "e", 4,1);
String result51 = evaluate("ehello.wolrd.1ee", "e", 5,1); String result1 = evaluate("ehello.wolrd.1ee", "e", 1,-1);
String result2 = evaluate("ehello.wolrd.1ee", "e", 2,-1);
String result3 = evaluate("ehello.wolrd.1ee", "e", 3,-1);
String result4 = evaluate("ehello.wolrd.1ee", "e", 4,-1);
String result5 = evaluate("ehello.wolrd.1ee", "e", 5,-1); System.out.println("正序-result11= "+result11);
System.out.println("正序-result21= "+result21);
System.out.println("正序-result31= "+result31);
System.out.println("正序-result41= "+result41);
System.out.println("正序-result51= "+result51); System.out.println("---------------------------"); System.out.println("反序-result1= "+result1);
System.out.println("反序-result2= "+result2);
System.out.println("反序-result3= "+result3);
System.out.println("反序-result4= "+result4);
System.out.println("反序-result5= "+result5); System.out.println("---------------------------"); String result = evaluate("ehello.wolrd.1ee", "e", 0,-1);
System.out.println("index=0时-result= "+result); }
}

  

Java实现Mysql的 substring_index 函数功能的更多相关文章

  1. mySql中SUBSTRING_INDEX函数用法

    SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串.如果 count 是一个正数,返回从最后的(从左边开始 ...

  2. 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!

    一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...

  3. mysql增加自定义函数功能

    mysql默认是不能自定义函数的 当create function时 This function has none of DETERMINISTIC, NO SQL, or READS SQL DAT ...

  4. 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数

      1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...

  5. mysql开启函数功能

    输入 show variables like '%func%'; 命令 会看到 log_bin_trust_function_creators 的状态,如果是OFF表示自定义函数功能是关闭的 输入命令 ...

  6. MySQL数据库开启、关闭、查看函数功能的方法

    应用 MySQL 时,会遇到不能创建函数的情况.出现如下错误信息: ERROR 1418 : This function has none of DETERMINISTIC, NO SQL, or R ...

  7. MySQL substring_index函数

    MySQL  substring_index函数 substring_index(str,delim,count)       str:要处理的字符串       delim:分隔符       co ...

  8. 【mysql】group_concat函数substring_index函数

    1.group_concat函数:用于将多个字符串连接成一个字符串 用法规则: SELECT GROUP_CONCAT(拼接的字段) from tableName; 使用:查询basic_projec ...

  9. MySQL 字符串截取函数

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...

随机推荐

  1. centos重启出现type Control-D to continue【fsck使用】

    VMware vSphere克隆异常/dev/sda2:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.(i.e.,without -a or -p optio ...

  2. python判断文件的访问权限

    os.access(file, mode)判断文件的访问权限file为文件mode为操作模式,有这么几种:os.F_OK: 检查文件是否存在;os.R_OK: 检查文件是否可读;os.W_OK: 检查 ...

  3. Excel上下标如何设置?

    Excel表格怎么设置上下标?Excel上下标设置技巧 在21世纪的我们,平时的工作和学习中,经常会使用到一些专业的文档,比如方程式.数据的公式和科学计数等,其中均会涉及到许多的上下标符号输入以及使用 ...

  4. IO相关Demo

    这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...

  5. python assert断言用法

    作用:断言函数运行状态 语法:assert condition,判断condition运行状态,若condition状态为false,则上报错误:AssertionError

  6. sqlmap总结

    转自:http://www.zerokeeper.com/web-security/sqlmap-usage-summary.html 0x01 需要了解 当给 sqlmap 这么一个 url 的时候 ...

  7. ABP入门教程15 - 小结

    点这里进入ABP入门教程目录 效果预览 至此,ABP入门教程的CURD(增删改查)示例已完成,效果如下 登录 首页 查询课程 新增课程 修改课程 删除课程 阶段总结 关键步骤: 领域层创建实体基础设施 ...

  8. CSS .css边框属性(border)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Python对MongoDB增删改查

    pip install pymongo import pymongo # 建立连接 client = pymongo.MongoClient() # 指定数据库 (不存在则会新建) db = clie ...

  10. bash的基本特性

    1.命令历史 作用:查看之前使用的命令 关于命令历史的文件 每个用户家目录下面的.bash_history 在关机的时候,会自动写入一次(history -r 将内存中的命令历史写入文件) 关于命令历 ...