MySQL字符串处理求助:特定格式字符串转换结果异常问题
哈哈,我找到问题根源了!先看你的SQL,你处理第二个字符串X322-1-383128的时候,前面的a/b/c/d测试字段居然还是用第一个字符串计算的——不过这只是测试显示的小问题,更关键的是你对第三部分的截取逻辑错了,导致第二个结果没得到预期的X322138328。
问题核心分析
你的需求是把X322-1-381128转成X322138128、X322-1-383128转成X322138328,本质是:去掉所有-后,还要删掉第三段里的第4个字符(也就是那个多余的1),或者说第三段取「前3位+后2位」。
你之前取的是第三段的前2位(38)+最后3位(128),所以不管第三段是381128还是383128,拼出来都是38128,自然两个结果完全一样。
正确解决方案
给你两种写法,第一种是通用拆分写法(适合字段格式固定但各段长度可能变化的场景),第二种是针对当前固定格式的简化写法:
写法一:通用拆分法(推荐)
用SUBSTRING_INDEX拆分各段,再针对性处理第三部分,兼容性更强:
SELECT -- 处理第一个字符串 'X322-1-381128' AS original_str, CONCAT( SUBSTRING_INDEX('X322-1-381128', '-', 1), -- 取第一部分:X322 SUBSTRING_INDEX(SUBSTRING_INDEX('X322-1-381128', '-', 2), '-', -1), -- 取第二部分:1 SUBSTRING(SUBSTRING_INDEX('X322-1-381128', '-', -1), 1, 3), -- 取第三部分前3位:381 SUBSTRING(SUBSTRING_INDEX('X322-1-381128', '-', -1), -2) -- 取第三部分后2位:28 ) AS target_str UNION ALL SELECT -- 处理第二个字符串 'X322-1-383128' AS original_str, CONCAT( SUBSTRING_INDEX('X322-1-383128', '-', 1), SUBSTRING_INDEX(SUBSTRING_INDEX('X322-1-383128', '-', 2), '-', -1), SUBSTRING(SUBSTRING_INDEX('X322-1-383128', '-', -1), 1, 3), SUBSTRING(SUBSTRING_INDEX('X322-1-383128', '-', -1), -2) ) AS target_str;
运行后会得到符合预期的结果:
+---------------+------------+ | original_str | target_str | +---------------+------------+ | X322-1-381128 | X322138128 | | X322-1-383128 | X322138328 | +---------------+------------+
写法二:固定位置截取法
如果你的字符串格式永远是Xxxx-1-xxxxxx这种固定长度,可以直接按字符位置截取,更简洁:
SELECT 'X322-1-381128' AS original_str, CONCAT( SUBSTRING('X322-1-381128', 1, 4), -- X322 SUBSTRING('X322-1-381128', 6, 1), -- 1 SUBSTRING('X322-1-381128', 8, 3), -- 381 SUBSTRING('X322-1-381128', 11, 2) -- 28 ) AS target_str UNION ALL SELECT 'X322-1-383128' AS original_str, CONCAT( SUBSTRING('X322-1-383128', 1, 4), SUBSTRING('X322-1-383128', 6, 1), SUBSTRING('X322-1-383128', 8, 3), SUBSTRING('X322-1-383128', 11, 2) ) AS target_str;
另外,我把两个字符串的处理用UNION ALL分开,避免了之前混淆测试字段的问题,逻辑更清晰。
内容的提问来源于stack exchange,提问作者user3368883
相关产品推荐
相关产品推荐

