文章目录

  • 问题描述
  • 解决方案
  • 行转列
  • 统计长度
  • TODO:创建函数
  • 遇到的坑
  • 参考文献

问题描述

数据库中有些数据以半角逗号 , 为分隔符,需要获取分割后的值或长度

-- 创建表
CREATE TABLE `person` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`name` varchar(255) NOT NULL COMMENT '用户名',`hobby` text NOT NULL COMMENT '爱好,多个用英文逗号分隔',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- 插入数据
INSERT INTO `person` VALUES (1, '刘一', '拳击,击剑');
INSERT INTO `person` VALUES (2, '陈二', '篮球,足球,排球');
INSERT INTO `person` VALUES (3, '张三', '跑步,羽毛球,乒乓球');
INSERT INTO `person` VALUES (4, '李四', '羽毛球');
INSERT INTO `person` VALUES (5, '王五', '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000');

解决方案

  • SUBSTRING_INDEX(str, delim, count):返回字符串 str 在分隔符 delim 出现 count 次前的子字符串
  • LENGTH(str):返回字符串 str 的长度
  • REPLACE(str, from_str, to_str):返回字符串 str,并将所有 from_str 字符串替换为字符串 to_str
  • 系统内置表 mysql.help_topic:帮助主题内容表

行转列

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(你的字段, ',', help_topic_id + 1), ',', -1)
FROM mysql.help_topic, 你的表
WHERE 1=1
AND help_topic_id < LENGTH(你的字段) - LENGTH(REPLACE(你的字段, ',', ''))+1
AND 具体条件

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(hobby, ',', help_topic_id + 1), ',', -1)
FROM mysql.help_topic, person
WHERE 1=1
AND help_topic_id < LENGTH(hobby) - LENGTH(REPLACE(hobby, ',', ''))+1
AND id=3

效果

缺点:

  1. 需要有权限调用 mysql.help_topic 表
  2. mysql.help_topic 表不可为空
  3. mysql.help_topic 表的自增 id,最大值为659,若逗号个数大于该值,需要自己单独处理

解决办法:任意找一个可读表,只需要 id 是从 0 或 1 开始的自然数序列,便可替代 mysql.help_topic 表

统计长度

逗号数量

SELECT *, LENGTH(你的字段) - LENGTH(REPLACE(你的字段, ',', ''))
FROM 你的表

元素数量

SELECT *, LENGTH(你的字段) - LENGTH(REPLACE(你的字段, ',', '')) + 1
FROM 你的表

SELECT *, LENGTH(hobby) - LENGTH(REPLACE(hobby, ',', '')) AS '逗号数量', LENGTH(hobby) - LENGTH(REPLACE(hobby, ',', '')) + 1 AS '元素数量'
FROM person

效果

TODO:创建函数

How to split the name string in mysql?

MySQL 字符串拆分操作(含分隔符的字符串截取)

遇到的坑

mysql.help_topic表无权限使用解决方法

参考文献

  1. MySQL Manual String Functions and Operators
  2. MySQL字符串函数和操作符
  3. mysql字符串拆分实现split功能
  4. MySQL——字符串拆分(含分隔符的字符串截取)
  5. How to split the name string in mysql?
  6. How to split and search in comma-separated string in MySQL

MySQL实现字符串分割split并获取长度相关推荐

  1. MySQL实现字符串逗号分割split并获取长度

    问题描述 数据库中有些数据以半角逗号 , 为分隔符,需要获取分割后的值或长度 -- 创建表 CREATE TABLE `person` (`id` int(11) NOT NULL AUTO_INCR ...

  2. 字符串分割split

    字符串分割split c标准库: void cSplit() {char* pStr = const_cast<char*>("hello,world");char* ...

  3. Boost:字符串分割Split的测试程序

    Boost:字符串分割Split的测试程序 实现功能 C++实现代码 实现功能 字符串分割Split的测试程序 C++实现代码 #include <string> #include < ...

  4. JS对象 字符串分割 split() 方法将字符串分割为字符串数组,并返回此数组。 语法: stringObject.split(separator,limit)...

    字符串分割split() 知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如 ...

  5. oracle split 分割字符串,Oracle字符串分割Split

    Oracle字符串分割Split 一.创建数组类型 Sql代码 CREATE OR REPLACE TYPE T_RET_TABLE IS TABLE OF VARCHAR2(512) 二.创建字符串 ...

  6. mysql完成字符串分割

    数据分割字符串,像spilt那样按某个符号将字符串分割成多个数组 mysql: 使用方法LENGTH()长度, SUBSTRING_INDEX()分割字符串, REPLACE()替换字符串 REVER ...

  7. Javascript:字符串分割split()妙用

    概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...

  8. 【Java字符串分割[split()]和截取[substring()]】

    最近写代码时遇到自字符串分割和截取的问题,在此总结一下. 字符串的分割: 一般自字符串的分割常用的方法是java.lang包中的String.split()方法,返回是一个字符串数组. 语法: pub ...

  9. 字符串分割split()方法:将一个字符串通过指定的分隔符分割成若干子串

    11111 将这行数据存为字符串,然后调用字符串分割函数split将其分割成字符数组String [] strRating,在定义一个整型数组,将字符数组转换成整数数组: import java.ut ...

最新文章

  1. VS2013+openCV3.0无脑配置方法+解决警告问题【windows平台】
  2. php的主要架构,php运行原理与基本结构
  3. C#生成XSD规范,利用XmlSchema类
  4. Sourcetail 一款代码编辑神器,让看源码如丝般顺滑
  5. undefined reference to `gdk_monitor_get_scale_factor/gtk_widget_get_scale_factor‘
  6. 【数据结构】二叉树题目代码总结 (快速排序与汉诺塔的非递归 、判断完全二叉树 、二叉链表交换左右孩子 、01背包问题)
  7. 五种常用的绩效考核工具对比
  8. Java模拟新浪微博登陆抓取数据
  9. JPEG 推荐的DC和AC系数的huffman(哈夫曼)码表
  10. elasticsearch基础知识
  11. 《Cisco VPP SFC》2、NSH_SFC 安装
  12. 客户端与服务器相关概念
  13. ubuntu16.04挂载三星T5移动硬盘报错
  14. 【读书笔记】《终身成长》——热爱挑战相信努力
  15. 基础编程题目集 函数题部分
  16. C# 无法加载 DLL 找不到指定的模块 (异常来自HRESULT:0x8007007E)的几种可能情况
  17. 计算机基础长江出版社课件,《计算机应用基础多媒体课件的设计.doc
  18. 近三年浙大MBA/EMBA/IMBA/MPA/MEM提面录取占比,报考难易度窥测
  19. Linux文件共享服务
  20. 为什么说“低估值买入,买到即赚到”?| 佛系理财

热门文章

  1. java高级软件工程师面试题
  2. Asp.net 获取泛微OA个人信息并生成二维码名片vCard
  3. 基于Java超市管理系统/超市收银系统
  4. CAD开发:DWG合并,dwg转换为dxf
  5. ESLint-[转自 花裤衩 的掘金]
  6. xp系统没有服务器时间,XP系统里时区没有北京时区
  7. 【Lombok】Lombok 使用教程大全
  8. linux分屏使用教程,Vim分屏功能_Linux教程_Linux公社-Linux系统门户网站
  9. 确认!贾扬清加盟阿里,任技术副总裁
  10. 双十二:2017这些活动不可错过