前言
之前一个项目运营要数据有点小麻烦,一开始我本着能动嘴就不动手的原则,让她们动手的,没想到她们用魔法打败了魔法
一,摸索
需求点:将收货地址根据符拆分成多列显示,,,
数据格式:(中国,北京,东城区,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 门号