当前位置: 首页 > 知识库问答 >
问题:

mysql如何使用SUBSTRING_INDEX函数对对应的字符串实现列转行的效果?

越飞语
2023-09-06

问题描述

mysql如何使用SUBSTRING_INDEX函数对对应的字符串实现列转行的效果?

我在用mysql的SUBSTRING_INDEX函数处理表中的一个字段值时遇到了这个问题,这个字段中的数据是如下这个样子(注意这是一个单元格内的数据长这个样子,不是多个单元格)

使用过【35869209395881】的号码清单:
[20230608,广东,广州,19876298082],[20230609,广东,广州,19864391337],[20230610,广东,广州,19875475010]
使用过【86536704443634】的号码清单:
[20230320,广东,广州,13660250915],[20230412,广东,广州,13527671189],[20230523,广东,广州,13527864794],[20230523,广东,广州,13602403001],[20230523,广东,广州,15975441679],[20230524,广东,广州,13760718971],[20230525,广东,广州,13710479054],[20230606,广东,广州,13710034067],[20230608,广东,广州,13416248767],[20230608,广东,广州,19864070445],[20230608,广东,广州,19876298082]
使用过【86855103086379】的号码清单:
[20230407,广东,广州,17278756850],[20230407,广东,广州,19513761138],[20230407,广东,广州,19576161138],[20230408,广东,广州,13512761189],[20230408,广东,广州,13527671189],[20230524,广东,广州,13527864794],[20230525,广东,广州,13609703269],[20230610,广东,广州,19864070445],[20230610,广东,广州,19876298082],[20230612,广东,广州,15790403652]
使用过【86947206218694】的号码清单:
[20230613,广东,广州,19876298082]

问题出现的环境背景及自己尝试过哪些方法

我的问题是出现在mysql处理这个表phone_number_demo中的IMEI_rel字段过程时遇到的,
当时我采用了SUBSTRING_INDEX函数进行拆分,但是我的处理方法最终只实现到了将[]内的内容拆分出来,【】中的序列号始终没有拆分出来。

相关代码

SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 1), '[', -1) AS date,SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 2), ',', -1) AS region,SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', 3), ',', -1) AS city,SUBSTRING_INDEX(SUBSTRING_INDEX(data, ',', -1), ']', 1) AS phoneFROM(    SELECT        SUBSTRING_INDEX(SUBSTRING_INDEX(IMEI_rel, ']', n), '[', -1) AS data    FROM        phone_number_demo,        (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3) AS numbers    WHERE            IMEI_rel LIKE '使用过%'    ORDER BY        IMEI_rel, n   ) AS subquery;

你期待的结果是什么?实际看到的错误信息又是什么?

我的目的是将【】和[]中的数据拆分出来并且一一对应,实现的效果为
序列号 日期 省份 城市 手机号
XXX XXX XXX XXX XXX

最终拆分出来的效果是image.png

共有1个答案

梁明辉
2023-09-06

用MySQL的SUBSTRING_INDEX和SUBSTRING函数来拆分字符串

SET SESSION group_concat_max_len = 1000000;DROP TEMPORARY TABLE IF EXISTS temp_data;CREATE TEMPORARY TABLE temp_data ASSELECT     SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(IMEI_rel, '使用过', -1), '】', numbers1.n), '【', -1) AS serial_number,    SUBSTRING_INDEX(SUBSTRING_INDEX(IMEI_rel, '】', numbers1.n), '【', -1) AS data_segmentFROM     phone_number_demoJOIN     (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) AS numbers1ON     CHAR_LENGTH(IMEI_rel) - CHAR_LENGTH(REPLACE(IMEI_rel, '【', '')) >= numbers1.n - 1ORDER BY     IMEI_rel, numbers1.n;DROP TEMPORARY TABLE IF EXISTS temp_result;CREATE TEMPORARY TABLE temp_result ASSELECT     serial_number,    SUBSTRING_INDEX(SUBSTRING_INDEX(data_segment, ',', 1), '[', -1) AS date,    SUBSTRING_INDEX(SUBSTRING_INDEX(data_segment, ',', 2), ',', -1) AS region,    SUBSTRING_INDEX(SUBSTRING_INDEX(data_segment, ',', 3), ',', -1) AS city,    SUBSTRING_INDEX(SUBSTRING_INDEX(data_segment, ',', -1), ']', 1) AS phoneFROM     temp_dataJOIN     (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) AS numbers2ON     CHAR_LENGTH(data_segment) - CHAR_LENGTH(REPLACE(data_segment, '[', '')) >= numbers2.n - 1ORDER BY     serial_number, numbers2.n;SELECT     SUBSTRING(serial_number, 2, CHAR_LENGTH(serial_number) - 2) AS serial_number,    date,    region,    city,    phoneFROM     temp_result;
 类似资料:
  • 本文向大家介绍mysql截取的字符串函数substring_index的用法,包括了mysql截取的字符串函数substring_index的用法的使用技巧和注意事项,需要的朋友参考一下 截取的字符串为15,151,152,16',可以看作是ip吧(虽然这里指的不是iP), 然后要截取每个逗号之前那部分 以下的意思是:在字符串中以逗号为索引,获取不同索引位的字符 结果如下:

  • 本文向大家介绍我们如何使用MySQL SUBSTRING_INDEX()函数将名称字符串分成三部分?,包括了我们如何使用MySQL SUBSTRING_INDEX()函数将名称字符串分成三部分?的使用技巧和注意事项,需要的朋友参考一下 为了使其理解,我们使用了来自名为“ customerdetail”的表中的以下数据。 现在,假设我们要将名称分为“ First_name”,“ Middle_Nam

  • 问题内容: 我正在尝试对包含数字的字符串列表进行排序 但是列表是排序而不是列表 问题答案: 您要基于值(而不是字符串值)进行排序,因此请尝试:

  • 本文向大家介绍如果我们提供参数'count'的负值,MySQL SUBSTRING_INDEX()函数如何返回子字符串?,包括了如果我们提供参数'count'的负值,MySQL SUBSTRING_INDEX()函数如何返回子字符串?的使用技巧和注意事项,需要的朋友参考一下 MySQL SUBSTRING_INDEX()函数可以接受参数'count'的负值,在这种情况下,它从最终定界符的右边返回子

  • 问题内容: 我必须形成一个JSON字符串,其中一个值具有换行符。必须对此进行转义,然后使用AJAX调用发布。任何人都可以提出一种使用JavaScript对字符串进行转义的方法。我没有使用jQuery。 问题答案: 使用您的JSON及其它。然后使用方法和替换所有出现的用。 编辑: 据我所知,还没有知名的JS库可用于转义字符串中的所有特殊字符。但是,您可以链接方法并替换所有特殊字符,如下所示: 但这很

  • 问题内容: 我知道这听起来微不足道,但是我没有意识到 的功能很奇怪。我有一个实际上是字符串形式的“数字”列表,因此我先将它们转换为整数,然后尝试进行排序。 给我: 我想要的是 我四处寻找与排序数字集相关的算法,但是我发现所有算法都涉及对字母数字集进行排序。 我知道这可能是个没有脑子的问题,但是google和我的教科书没有提供比该.sort()功能有用的功能。 问题答案: 您实际上尚未将字符串转换为