如何将MySQL字段中的逗号分隔值转换为多行?

2 02 3 年4 月,北京某公司的数据库工程师遇到了用逗号分隔字段值的问题。

方案一:直接UNIONALL,写硬代码,AS val UNION ALL SELECT SUBSTRING_INDEX('1 ,2 ,3 ,4 ,5 ,6 ',',', 1 ) AS val UNION ALL SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1 ,2 ,3 ,4 ,5 ,',UN),'All ,UN SUBSTRING_INDEX(SUBSTRING_INDEX('1 ,2 ,3 ,4 ,5 ,6 ',',', 3 ).cte AS (select 1 AS n, '1 ,2 ,3 ,4 ,5 ,6 ' AS str UNION 选择所有 n+1 , str FROM cte WHERE n < length>length(replace,(str),','+SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', n), ',', -1 ) AS val FROM cte;,适用于 MySQL8 .0+ 选项 3 :存储过程,完整 AS DELIMITER//创建过程 split_comma_values(In input_str VARCHAR(1 000)) DECLARE val_count INT; -
计算值的数量 SET val_count = LENGTH(input_str)
replace(input_str, ',') + 1 ; -
创建临时表来存储结果 CREATE TEMPORARY TABLE TEMP_RESULT(val VARCHAR(2 5 5 )); LOOP FOR EACH VALUE i <= SET temp_str(SUBSTRING_INDEX(input_str, ',', -1 ) INSERT INTO temp_str) i + 1 ; 从 temp_result 返回结果;适合复杂逻辑,对变量值使用 UNIONALL。

MySQL实现列数据拆分为多行mysql一列拆分多行

好吧,昨天我在设置客户反馈表时发生了一些事情。
有一个表列全是文本。
每个客户的不同要求用逗号分隔。
我想在单独的行中查看每个要求。
我当时用的是MySQL,所以想测试一下如何拆分。

刚刚在宿舍电脑上打字,试了好久。
开始使用 substring_index 是那个函数。
我想我应该将电缆分成逗号并将其从层中拉出。
例如,将第一标准和第二标准分开。
摸索了半天,发现确实可以出来,但是我很难写出一个循环,所以我就想是否可以用一个 union 将它们直接连接起来。

因此,子查询是使用all的并集来存储的,最终的输出结果非常好。
红、绿、蓝,然后是黄、粉、紫……颜色一一显现出来,真的是这样的。
我当时觉得真的很有趣,所以就写下来了。
不过后来我记得MySQL好像在5 .7 之后就有了JSON处理功能。
也可以用吗?我再次检查了 JSON_TABLE 和 JSON_ARRAY。
我尝试将逗号分隔的字符串转换为 JSON 数组,然后通过 JSON_TABLE 输出它,它成功了。
而且我感觉这个方法比较现代,就是保证数据源是JSON兼容的。

两种方法各有优点。
如果您熟悉字符串操作,则 substring_index 更简单且易于理解。
JSON方式比较通用,但是首先要保证数据格式合适。
和做饭一样,有的蔬菜可以直接搅拌,有的则必须先清洗。
等等,拔毛的方式好像有点不太合适。

对于其中任何一个来说,最重要的是观看特定的场景。
有时候数据格式很固定,substring_index效率更高;有时数据结构比较复杂,JSON处理更加透明。
正如我上次浏览日志文件一样,逐行读取比全文搜索快得多。
当然这要视情况而定。

话虽如此,为什么客户要用逗号分隔他们的需求?当他们组织自己的时候你没注意格式吗?这个你应该去问业务部门。

mysql中怎么做pivot

坦白说,使用集算器对MySQL进行Pivot操作就像使用瑞士军刀处理数据一样。
它非常简单,但您需要知道如何使用它。
我们先来说说最重要的事情。
去年我们运行了一个电子商务分析项目,有 2 000 万条销售记录。
直接在 MySQL 中编写动态枢轴语句就像被困的拖拉机一样运行——行话中称为雪崩效应。
事实上,前面的一个小延迟会导致后面的所有内容下降。
另外,集算器的数据预处理非常实用。
例如,你可以用它过滤2 02 3 年全年的数据,然后将三个库的维度表组合起来,这样结果就不会因为枢轴时的脏数据而混成一锅粥。
还有一个更重要的细节。
集算器的列到列转换功能支持条件过滤。
去年我们的项目中,通过添加“仅转载销量1 000以上的品类”参数,处理时间进一步缩短了一半。

一开始我以为集算器是万能的,后来发现错了。
它对超旧版本MySQL的支持相当有限,需要首先验证兼容性。
说实话,这是一个骗局,但很多人并没有注意到这一点。
建议先在集算器中用小样本数据跑几轮看看性能,然后再添加到大表中。

MySQL数据转换:如何高效地实现行列互转和字符串拆分?

记得有一次,在一个旧的数据库项目中,我提出了一个需求:我需要使用行分隔的字符串将一个字段分成多行数据。
当时MySQL的版本还停留在5 .7 ,没有办法依赖提供的工具,只好自己解决。

我首先尝试了存储过程,使用 subSTRING_INDEX 函数提取每个值,然后插入一个新表。
这个过程非常乏味,我花了将近一个小时来编写存储过程,然后又花了一个小时来调试它以确保我没有丢失任何逗号分隔的值。

我记得去年五月的那一天。
他很高兴来到办公室。
我坐在窗边,敲着代码,看着窗外的天空。
调试成功后,我松了一口气。
他感觉自己好像跑完了一场马拉松。

后来发现还有一个需要将多列数据转换为多行数据。
这次,我决定尝试连接一切,这比库存系统快得多。
我编写了简单的 SQL 来连接所有列,然后 JOIN ALL 来连接每列中的数据。

那天晚上,我回到家坐在沙发上,我突​​然想到,如果以后MySQL的版本更新了,手写的SQL语句还有用吗?等等,还有。
我想我是在技术论坛上看到的。
MySQL 8 .0之后有一个JSON_TABLE函数。
会不会更方便呢?
现在手头上的项目仍然使用MySQL 5 .7 ,但我已经开始学习MySQL 8 .0的新功能。
有时,我想知道如果我现在开始使用这些新功能,它会让我的工作变得更轻松吗?