前言
之前一個項目運營要數據有點小麻煩,一開始我本着能動嘴就不動手的原則,讓她們動手的,沒想到她們用魔法打敗了魔法
一,摸索
需求點:將收貨地址根據符拆分成多列顯示,,,
數據格式:(中國,北京,東城區,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 門號