MySQL 5.5.62中使用SUBSTRING_INDEX提取字符串前两元素的问题
解决MySQL提取按空格分隔的前两个元素的问题
针对你的需求——不管sStringNew字段里有多少个空格,只提取按空格分隔的第一个元素和第二个元素,可以通过组合使用LOCATE()、SUBSTRING()和SUBSTRING_INDEX()函数来实现,完美适配你的MySQL 5.5.62版本。
正确的SQL语句
SELECT SUBSTRING_INDEX(sStringNew, ' ', 1) AS sOne, SUBSTRING_INDEX(SUBSTRING(sStringNew, LOCATE(' ', sStringNew) + 1), ' ', 1) AS sTwo FROM `dotablenew`;
语句拆解解释
我们一步步看每个部分的作用:
- 提取第一个元素
sOne:和你原来的写法一致,SUBSTRING_INDEX(sStringNew, ' ', 1)会截取第一个空格之前的内容,比如D1080、D5258等,这部分逻辑是对的。 - 提取第二个元素
sTwo:- 先用
LOCATE(' ', sStringNew)定位到字符串中第一个空格的位置,再用SUBSTRING(sStringNew, LOCATE(' ', sStringNew) + 1)截取第一个空格之后的所有内容(比如第一行会得到ARE A,第二行会得到SEG)。 - 最后对这个截取后的子串使用
SUBSTRING_INDEX(..., ' ', 1),只取它的第一个空格之前的内容——不管子串后面还有多少个空格分隔的元素,我们只保留原字符串的第二个元素。
- 先用
测试验证结果
执行这条SQL后,你会得到完全符合预期的结果:
+-------+------+ | sOne | sTwo | +-------+------+ | D1080 | ARE | | D5258 | SEG | | D0749 | COR | | D4278 | VAI | | D2664 | PON | +-------+------+ 5 rows in set (0.00 sec)
边界情况兼容
如果某个sStringNew字段只有两个元素(比如第二行的D5258 SEG),SUBSTRING_INDEX(SUBSTRING(...), ' ', 1)依然能正确返回第二个元素——当子串里没有空格时,SUBSTRING_INDEX会直接返回整个子串,不会出错。
内容的提问来源于stack exchange,提问作者Chevy Mark Sunderland
相关产品推荐
相关产品推荐

