首页 > 数据库 >【MySQL】substring_index 函数详解

【MySQL】substring_index 函数详解

时间:2023-03-14 09:44:52浏览次数:47  
标签:index INDEX ip utf8mb4 SUBSTRING substring MySQL NULL tb

【MySQL】substring_index 函数详解

命令格式

string substring_index(string <str>, string <separator>, int <count>)

命令说明

截取字符串strcount个分隔符之前的字符串。如果count为正,则从左边开始截取。如果count为负,则从右边开始截取。此函数为MaxCompute 2.0扩展函数。

参数说明

  • str:必填。STRING类型。待截取的字符串。
  • separator:必填。STRING类型的分隔符。
  • count:必填。INT类型。指定分隔符位置。

返回值说明

返回STRING类型。如果任一输入参数值为NULL,返回NULL。

栗子1

  • 示例1:截取字符串https://help.codingce.com。命令示例如下:
# 返回 https://help.codingce
select substring_index('https://help.codingce.com', '.', 2);
# 返回 codingce.com
select substring_index('https://help.codingce.com', '.', -2);
  • 示例2:任一输入参数为NULL。命令示例如下:
# 返回NULL
select substring_index('https://help.codingce.com', null, 2);

栗子2

假设有三个 IP:127.0.0.1、192.128.0.15、255.255.255.255,要分别取每一个号段的值并返回。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_ip
-- ----------------------------
DROP TABLE IF EXISTS `tb_ip`;
CREATE TABLE `tb_ip`  (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_ip
-- ----------------------------
INSERT INTO `tb_ip` VALUES (1, '127.0.0.1');
INSERT INTO `tb_ip` VALUES (2, '192.128.0.15');
INSERT INTO `tb_ip` VALUES (3, '255.255.255.255');

SET FOREIGN_KEY_CHECKS = 1;
SELECT
	ip,
	SUBSTRING_INDEX( tb_ip.ip, '.', 1 ) AS part1,
	SUBSTRING_INDEX( SUBSTRING_INDEX( tb_ip.ip, '.', 2 ), '.', -1) AS part2,
	SUBSTRING_INDEX( SUBSTRING_INDEX( tb_ip.ip, '.', 3 ), '.', -1) AS part3,
	SUBSTRING_INDEX( SUBSTRING_INDEX( tb_ip.ip, '.', 4 ), '.', -1) AS part4
FROM
	tb_ip;

结果:

ip				part1	part2	part3	part4
127.0.0.1		127		0		0		1
192.128.0.15	192		128		0		15
255.255.255.255	255		255		255		255

栗子3

可以说是一个面试题,解法有多种,那么如果用 SUBSTRING_INDEX 要如何编写呢?

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_value_output
-- ----------------------------
DROP TABLE IF EXISTS `tb_value_output`;
CREATE TABLE `tb_value_output`  (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `year` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `month` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `amount` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tb_value_output
-- ----------------------------
INSERT INTO `tb_value_output` VALUES (1, '1991', '1', '1.1');
INSERT INTO `tb_value_output` VALUES (2, '1991', '2', '1.2');
INSERT INTO `tb_value_output` VALUES (3, '1991', '3', '2.2');
INSERT INTO `tb_value_output` VALUES (4, '1991', '4', '2.5');
INSERT INTO `tb_value_output` VALUES (5, '1992', '1', '2.1');
INSERT INTO `tb_value_output` VALUES (6, '1992', '2', '2.4');
INSERT INTO `tb_value_output` VALUES (7, '1992', '3', '2.1');
INSERT INTO `tb_value_output` VALUES (8, '1992', '4', '2.5');

SET FOREIGN_KEY_CHECKS = 1;
SELECT
	vo.year,
	SUBSTRING_INDEX( GROUP_CONCAT( vo.amount ), ",", 1 ) AS m1,
	SUBSTRING_INDEX( SUBSTRING_INDEX( GROUP_CONCAT( vo.amount ), ",", 2 ), ",", - 1 ) AS m2,
	SUBSTRING_INDEX( SUBSTRING_INDEX( GROUP_CONCAT( vo.amount ), ",", - 2 ), ",", 1 ) AS m3,
	SUBSTRING_INDEX( GROUP_CONCAT( vo.amount ), ",", - 1 ) AS m4 
FROM
	tb_value_output vo 
GROUP BY
	vo.year

结果:

year	m1	m2	m3	m4
1991	1.1	1.2	2.2	2.5
1992	2.1	2.4	2.1	2.5

其它

GROUP_CONCAT 函数:将相同的行组合起来。

标签:index,INDEX,ip,utf8mb4,SUBSTRING,substring,MySQL,NULL,tb
From: https://www.cnblogs.com/mzdljgz/p/17213790.html

相关文章

  • 使用Java替换字符串占位符的几种方法 String url2 = "jdbc:mysql://{0}:{1}/{2}"
    使用Java替换字符串占位符的几种方法https://blog.csdn.net/m0_67402125/article/details/125383655importorg.apache.commons.lang.text.StrSubstitutor;importj......
  • 一天吃透MySQL锁面试八股文
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • Mysql锁与事务
    我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本......
  • mysql排名,分组排名,行号
    基本知识:1.sql语句中,使用@来定义一个变量。如:@rank2.sql语句中,使用:=来给变量赋值,:@rank:=123,则变量rank的值为1233.sql语句中,if(A,B,C)表示,如果A条件成立,那......
  • MySQL
        ......
  • mysql
    一、计算机如何存储字符如何存储英文字符ASCII:对英文字母及其符号进行了编码,总共有128个Latin-1:对欧洲字符进行了编码,总共有256个,兼容ASCII如何存储中文字符GB......
  • Docker搭建MySQL集群
    采用MySQL架构PerconaXtraDBCluster1.安装PXC集群#用pull拉PXC5.7.20版本[root@localhost~]#dockerpullpercona/percona-xtradb-cluster:5.7.205.7.20:Pulli......
  • mark:通过实现从mysqldump全量导出中导出某个库的所有行
    环境python3 mysqldump_export_one_db.py#encoding=utf-8'''用于mysqldump--all-databases...全库导出数据后,需要从SQL文件中抽取某个库的信息生成新SQL文件,如果......
  • mysql查询所有表+表结构
    selecttable_nametableName,engine,table_commenttableComment,table_collationtableCollation,create_timecreateTimefrominformation_schem......
  • 14.mysql主从复制之从服务器宕机处理
    1.查看从库上mysql的错误日志,里面有记录主从挂掉时的binlog信息2.有了binlog和position信息后,只需要重新在从库上进行changemasterto配置即可,配置后开启slave状态,没有报......