Java实现Mysql的 substring_index 函数功能
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 函数功能的更多相关文章
- mySql中SUBSTRING_INDEX函数用法
SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串.如果 count 是一个正数,返回从最后的(从左边开始 ...
- 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!
一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...
- mysql增加自定义函数功能
mysql默认是不能自定义函数的 当create function时 This function has none of DETERMINISTIC, NO SQL, or READS SQL DAT ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- mysql开启函数功能
输入 show variables like '%func%'; 命令 会看到 log_bin_trust_function_creators 的状态,如果是OFF表示自定义函数功能是关闭的 输入命令 ...
- MySQL数据库开启、关闭、查看函数功能的方法
应用 MySQL 时,会遇到不能创建函数的情况.出现如下错误信息: ERROR 1418 : This function has none of DETERMINISTIC, NO SQL, or R ...
- MySQL substring_index函数
MySQL substring_index函数 substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 co ...
- 【mysql】group_concat函数substring_index函数
1.group_concat函数:用于将多个字符串连接成一个字符串 用法规则: SELECT GROUP_CONCAT(拼接的字段) from tableName; 使用:查询basic_projec ...
- MySQL 字符串截取函数
MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...
随机推荐
- C#&.Net干货分享-构造QRCoderHelper生成二维码图片
不想说废话,直接源码拿去用... /// <summary> /// 二维码管理 /// </summary> public class QRCoderHel ...
- sql server日期转换为dd-mon-yyyy和dd-MMM-yyyy这样的英文月份格式(27-Aug-2019)
脚本: /* 功能:sql server日期转换为dd-mon-yyyy和dd-MMM-yyyy这样的格式 示例:27-Aug-2019 作者:zhang502219048 脚本来源:https:// ...
- 二维数组中的查找(剑指offer_4)
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序.给定一个数,判断这个数是否在该二维数组中. Consider the following matrix: [ [1, 4, 7, 11 ...
- 《Google软件测试之道》
Google软件测试之道 Google对质量的理解 质量不等于测试,即质量不是被测出来的 开发和测试应该并肩齐驱,测试就是开发过程中不可缺少的一部分 质量是一种预防行为而不是检测 Google对软件测 ...
- Spring 中的观察者模式
一.Spring 中观察者模式的四个角色 1. 事件(ApplicationEvent) ApplicationEvent 是所有事件对象的父类.ApplicationEvent 继承自 jdk 的 ...
- SpringCloud gateway (史上最全)
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
- 【STM32H7教程】第32章 STM32H7的TIM定时器基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第32章 STM32H7的TIM定时器基础知识和H ...
- Java基础(六)
Spring依赖注入的几种方式 1.接口注入 2.setter方法注入 3.构造方法注入 Struts2的拦截器与过滤器的工作原理 1.Structs2拦截器是在访问某个Action或Action的某 ...
- Javascript模块化开发3——Grunt之预处理
一.grunt预处理简述 grunt的注册任务函数本身会对传入的参数和配置对象里的相关属性进行一定的预处理,方便任务函数进行操作. grunt的registerTask方法和registerMulti ...
- mkdir函数 (创建文件夹函数)
mkdir函数 #include <stdio.h> int main(){ mkdir("C:\\Users\\admin\\desktop\\test"); ; }