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. springioc之依赖注入

    1.1.2  IoC能做什么 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类 ...

  2. Flask的session

    ### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...

  3. CSV和JSON格式相互转换

    1.为什么要进行CSV与JSON格式之间的转换 CSV格式常用于一二维数据表示和存储,他是一种纯文本形式存储表格数据的表示方式.JSON也可以表示一二维数据.在网络信息传输中,可能需要统一表示方式,因 ...

  4. java之工厂方法设计模式

    工厂方法模式是设计模式中应用最广泛的模式.在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要.工厂方法模式就是解决这个问题,它通过面向对象的手法,将所要创建的具体对象创建工作延迟到了子 ...

  5. Java实现自定义注解开发

    Java实现自定义注解开发 一直都对注解开发挺好奇的,最近终于有时间自己实践了一把,记录一下 万一后期会用到呢 哈哈哈 首先我们了解一下自定义注解的标准示例,注解类使用 @interface 关键字修 ...

  6. SpringMVC参数绑定,这篇就够了!

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  7. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  8. .net 发送qq邮件

    最近开发一个项目,需要给客户发送报告邮件,在开发中遇到本地调试发送邮件一切正常,但当部署到服务器上的时候,一直返回“发送失败”,在此记录,以免以后采坑 webapi 端代码: /// <summ ...

  9. 团队项目之Scrum1

    小组:BLACK PANDA 时间:2019.11.16 部分 得分项 分数 完成内容 第 1 篇 Scrum 冲刺博客 各个成员在 Alpha 阶段认领的任务 3 明日各个成员的任务安排 3 用户登 ...

  10. docker in docker 的启动方式

    --privileged  -v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):/bin/docker 启动容器时添加上面 ...