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. 经典案例:如何优化Oracle使用DBlink的SQL语句

    转自 https://blog.csdn.net/Enmotech/article/details/78788083 作者介绍 赵全文 就职于太极计算机股份有限公司,在中央电化教育馆做Oracle D ...

  2. November 10th, Week 45th, Sunday, 2019

    Perfection has no place in love. 爱从不完美. Perfection has no place in love, and we should always try to ...

  3. 基于django的个人博客网站建立(四)

    基于django的个人博客网站建立(四) 前言 网站效果可点击这里访问 今天主要添加了留言与评论在后台的管理和主页文章的分页显示,文章类别的具体展示以及之前预留链接的补充 主要内容 其实今天的内容和前 ...

  4. [主动学习--查询策略] 01 Core-set

    符号定义 主动学习每一次迭代选择的样本数量为一个 budget 训练集中初始无标签数据集记为 unlabeled data,\(\bm{u}^0\) 训练集中初始有标签数据集记为 initial la ...

  5. 《Web Development with Go》Mangodb查询collection内所有记录

    相当于select * from table; package main import ( "fmt" "log" "time" " ...

  6. a是什么??

    //解决Linux下默认中文字体乱码问题 QFont font("simsun", 11, QFont::Normal, false); a.setFont(font);

  7. com.mysql.cj.exceptions.DataReadException: Zero date value prohibited

    com.mysql.cj.exceptions.DataReadException: Zero date value prohibited at com.mysql.cj.result.SqlTime ...

  8. 【python之路.一】基础

    数学操作符 数据类型 字符串复制(*复制次数int).连接(+) 该类操作只能同为字符串类型,否则需要强制转换类型 变量名规则 (驼峰式变量名&下划线式均可) # 注释 BIF(built-i ...

  9. mpvue快速入门

    主要特性 使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 彻底的组件化开发能力:提高代码复用性 完整的 Vue.js 开发体验 方便的 Vuex 数据管理方案:方便构建 ...

  10. Swoole Redis 连接池的实现

    概述 这是关于 Swoole 入门学习的第九篇文章:Swoole Redis 连接池的实现. 第八篇:Swoole MySQL 连接池的实现 第七篇:Swoole RPC 的实现 第六篇:Swoole ...