前言 

之前一个项目运营要数据有点小麻烦,一开始我本着能动嘴就不动手的原则,让她们动手的,没想到她们用魔法打败了魔法

一,摸索

需求点:将收货地址根据符拆分成多列显示,,,

数据格式:(中国,北京,东城区,xxxx小区,xx栋,xxx单元,xxx号)

返回效果:

国家   省份   城市      小区            楼栋       单元       门号

中国  北京   东城区  xxxx小区    xx栋       xxx单元   xxx号


一眼看去问题不大,使用PARSENAME函数分分钟搞定,,

PARSENAME sql server 自带函数,被分割的字符串必须是 '.',而且只能分割出4个字段,

所以使用的时候需要替换分割字符如:

SELECT address,
PARSENAME(REPLACE(address,',','.'),4) as 国家,
PARSENAME(REPLACE(address,',','.'),3) as 省市,
PARSENAME(REPLACE(address,',','.'),2) as 区域,
PARSENAME(REPLACE(address,',','.'),1) as 小区
FROM [dbo].[Address]

定睛一看不好使,,,没有解决问题,之后看了sql文档发现了这个玩意STRING_SPLIT(SQL Server 2016 新加入)

STRING_SPLIT 仅采用两个参数。 第一个是字符串,第二个是单个字符。STRING_SPLIT(字符串,分隔符) (STRING_SPLIT (string, separator))

查询SQL,

declare @str varchar(50)
set @str='中国,北京,东城区,xxxx小区,1栋'
select value from STRING_SPLIT(@str, ',')//默认字段 value

结果:
value
中国
北京
东城区
xxxx小区
1栋

这么一看差不多了,

二,自己动手

//@str :要分割的字符串
//@chars:分割符号
//@i :字符位置索引

create function [dbo].[split_str](@str varchar(50),@chars varchar(50), @i int)
returns varchar(50)
as
begin
declare @val varchar(50)
declare @SorderIdTemp table(
[Id] int identity(1,1),
[Value] nvarchar(max)) --定义临时表

insert into @SorderIdTemp([Value])
select value from STRING_SPLIT(@str, @chars)
select @val=value from @SorderIdTemp where [Id]=@i
delete from @SorderIdTemp
return @val
end

GO


效果:

declare @str varchar(50)
set @str='中国,北京,东城区,xxxx小区,xx栋,xxx单元,xxx号'


select [dbo].[split_str](@str,',',1) as 国家,[dbo].[split_str](@str,',',2) as 省份,
[dbo].[split_str](@str,',',3) as 城市,[dbo].[split_str](@str,',',4) as 小区,[dbo].[split_str](@str,',',5) as 楼栋,
[dbo].[split_str](@str,',',6) as 单元, [dbo].[split_str](@str,',',7) as 门号


 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐