点击上方蓝字“数据库干货铺” 解锁更多精彩内容
SQLSERVER在很多场景下需要自建函数来满足工作需求,本文就自建一个常用的字符串分割函数。
需求说明
将字符串按照指定的分隔符进行分割,并将结果按照从后往前的顺序倒序排列,拼接后的结果用‘/’符连接。(也可以按照指定符号分割为多个列,修改最后一部分即可)
创建测试表及数据
/* 创建一张测试表及数据 */
create table tmp(id int primary key ,name varchar(200));
insert into tmp
select 1,'组长,班长,校长,委员长';
insert into tmp
select 2 ,'连长,营长,师长,军长,司令';
insert into tmp
select 3 ,'村长,镇长,区长,市长,厅长,省长,部长';
创建函数
create FUNCTION [dbo].[f_split]
(
@str NVARCHAR(500),
@delimiter NVARCHAR(20)
)RETURNS @table2 TABLE(val NVARCHAR(500))
AS
BEGIN
DECLARE @index INT,@startsplit INT,@id INT ,@maxid int,@id2 int
declare @table table (id int,val nvarchar(50))
SELECT @index=CHARINDEX(@delimiter,@str),@startsplit=1,@id=1
WHILE @index>0
BEGIN
IF @id>1
BEGIN
SELECT @startsplit=@index+LEN(@delimiter)
SELECT @index=CHARINDEX(@delimiter,@str,@startsplit)
END
IF @index>0
BEGIN
INSERT INTO @table VALUES (@id,SUBSTRING(@str,@startsplit,@index-@startsplit))
END
ELSE
BEGIN
INSERT INTO @table VALUES (@id,SUBSTRING(@str,@startsplit,LEN(@str)-@startsplit+1))
END
SELECT @id=@id+1
END
select @id2=Min(id) from @table
select @maxid=MAX(id) from @table
insert into @table2 select val from @table where id=@maxid
select @maxid= @maxid -1
while @id2<=@maxid
begin
update @table2 set val=val+'/'+(select val from @table where id=@maxid )
select @maxid =@maxid- 1
end
RETURN
END
执行查询
select name,(select val from [f_split](name,','))
from tmp;
结果如下
TIPs:
-
以上函数包含字符串截取函数、字符串长度、字符串位置等,不太熟悉的小伙伴可以自己多练习一下
-
SQL SERVER 2016中新增了
STRING_SPLIT 函数,也建议大家了解一下
-
还有一个偏门的
PARSENAME函数也可以实现拆分,但是有局限性(是啥,自己测,哈哈)
如需获取该函数的每步说明可以联系我获取哦,谢谢。
往期精彩回顾
1. 升级python,就是这么简单
2. mysql8.0新增用户及加密规则修改的那些事
3. 比hive快10倍的大数据查询利器-- presto
4. 监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库
5. PostgreSQL主从复制--物理复制
6. MySQL传统点位复制在线转为GTID模式复制
扫
码
关
注