SQL拆分拼接函数:如何提取地址字段前三个分隔部分?
提取地址字段前3个部分的SQL解决方案
这问题我日常处理字符串需求时经常碰到,不同数据库的函数实现略有差异,给你整理几个主流数据库的可用方案,直接就能套用:
MySQL/MariaDB 实现
最省心的方式是用SUBSTRING_INDEX函数,它专门用来按指定分隔符截取字符串的前N个部分,语法简单直观:
SELECT SUBSTRING_INDEX(address, '.', 3) AS short_address FROM your_table;
举个实际例子:当address值为AB.CB.2k.SSS.45a时,这个函数会直接返回AB.CB.2k。如果某行地址的分段不足3个(比如只有XY.ZZ),函数会返回整个字符串,不会抛出错误,兼容性很友好。
PostgreSQL 实现
PostgreSQL可以通过数组转换的思路来实现:先把字符串拆分成数组,提取前3个元素后再拼接回字符串:
SELECT ARRAY_TO_STRING(STRING_TO_ARRAY(address, '.')[1:3], '.') AS short_address FROM your_table;
拆解一下逻辑:STRING_TO_ARRAY(address, '.')把地址按.拆成数组,[1:3]选取数组的第1到第3个元素(PostgreSQL数组索引从1开始),最后用ARRAY_TO_STRING把这三个元素用.重新拼接成完整的短地址。
SQL Server 实现
SQL Server没有直接的SUBSTRING_INDEX函数,但可以嵌套CHARINDEX来定位第三个.的位置,再截取前面的内容:
SELECT SUBSTRING( address, 1, CHARINDEX('.', address, CHARINDEX('.', address, CHARINDEX('.', address, 1)+1)+1) - 1 ) AS short_address FROM your_table;
如果你的SQL Server版本是2016及以上,也可以用STRING_SPLIT配合窗口函数实现,但上面的嵌套CHARINDEX方法兼容性更强,不用考虑版本限制。同样,当地址分段不足3个时,这个语句会返回整个原始地址。
内容的提问来源于stack exchange,提问作者A.DS
相关产品推荐
相关产品推荐

