Sql字符串分组Split函数的两种实现方法

简介: 在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是Sql中没有实现字符串分组的Split方法。因此就需要编写一个自定义的Split函数。我首先是使用表值函数的方法实现的字符串分组,但是在使用中感觉不是很方便。

在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是Sql中没有实现字符串分组的Split方法。因此就需要编写一个自定义的Split函数。我首先是使用表值函数的方法实现的字符串分组,但是在使用中感觉不是很方便。后来又在网上找到了一种使用两个标量函数,其中一个函数首先返回分割后字符数组的长度,另一个函数依次返回每个分割出的字符串。然后使用循环依次获取分割的字符。

表值函数实现Split方法

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
  Create   FUNCTION   [ dbo ] . [ SplitToTable ]
 (
     
@SplitString   nvarchar ( max ),
     
@Separator   nvarchar ( 10 ) = '   '
 )
 
RETURNS   @SplitStringsTable   TABLE
 (
 
[ id ]   int   identity ( 1 , 1 ),
 
[ value ]   nvarchar ( max )
 )
 
AS
 
BEGIN
     
DECLARE   @CurrentIndex   int ;
     
DECLARE   @NextIndex   int ;
     
DECLARE   @ReturnText   nvarchar ( max );
     
SELECT   @CurrentIndex = 1 ;
     
WHILE ( @CurrentIndex <= len ( @SplitString ))
         
BEGIN
             
SELECT   @NextIndex = charindex ( @Separator , @SplitString , @CurrentIndex );
             
IF ( @NextIndex = 0   OR   @NextIndex   IS   NULL )
                 
SELECT   @NextIndex = len ( @SplitString ) + 1 ;
                 
SELECT   @ReturnText = substring ( @SplitString , @CurrentIndex , @NextIndex - @CurrentIndex );
                 
INSERT   INTO   @SplitStringsTable ( [ value ] VALUES ( @ReturnText );
                 
SELECT   @CurrentIndex = @NextIndex + 1 ;
             
END
     
RETURN ;
 
END

 

select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')

结果为

id          value
----------- ---------------------------------------
1           111
2           b2222
3           323232
4           32d
5           e
6           323232f
7           g3222

(7 行受影响)

 

使用循环的方法

首先GetSplitLength函数返回分割后的字符数组的长度。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
  Create   function   [ dbo ] . [ GetSplitLength ]
 (
  
@String   nvarchar ( max ),   -- 要分割的字符串
   @Split   nvarchar ( 10 )   -- 分隔符号
 )
 
returns   int
 
as
 
begin
  
declare   @location   int
  
declare   @start   int
  
declare   @length   int
 
  
set   @String = ltrim ( rtrim ( @String ))
  
set   @location = charindex ( @split , @String )
  
set   @length = 1
  
while   @location <> 0
  
begin
    
set   @start = @location + 1
    
set   @location = charindex ( @split , @String , @start )
    
set   @length = @length + 1
  
end
  
return   @length
 
end

 

 

select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')

结果为7。

 

GetSplitOfIndex函数是按顺序分别获取分割后的字符串。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
  ALTER   function   [ dbo ] . [ GetSplitOfIndex ]
 (
  
@String   nvarchar ( max ),   -- 要分割的字符串
   @split   nvarchar ( 10 ),   -- 分隔符号
   @index   int   -- 取第几个元素
 )
 
returns   nvarchar ( 1024 )
 
as
 
begin
  
declare   @location   int
  
declare   @start   int
  
declare   @next   int
  
declare   @seed   int
 
  
set   @String = ltrim ( rtrim ( @String ))
  
set   @start = 1
  
set   @next = 1
  
set   @seed = len ( @split )
  
  
set   @location = charindex ( @split , @String )
  
while   @location <> 0   and   @index > @next
  
begin
    
set   @start = @location + @seed
    
set   @location = charindex ( @split , @String , @start )
    
set   @next = @next + 1
  
end
  
if   @location   = 0   select   @location   = len ( @String ) + 1  
  
  
return   substring ( @String , @start , @location - @start )
 
end

 

 

select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)

结果323232。

 

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
  DECLARE   @Tags   nvarchar ( max );
 
SELECT   @Tags = ' 111,b2222,323232,32d,e,323232f,g3222 ' ;
 
DECLARE   @Tag   nvarchar ( 1000 )
 
DECLARE   @next   int ;
 
set   @next = 1
 
 
DECLARE   @Length   int ;
 
SELECT   @Length = dbo.GetSplitLength( @Tags , ' , ' )

 
while   @next <= @Length
 
begin
     
SET   @Tag   =   left (dbo.GetSplitOfIndex( @Tags , ' , ' , @next ),  16 );
     
print   @Tag
     
SET   @Next = @Next + 1 ;
 
END

 

 

结果为:

111
b2222
323232
32d
e
323232f
g3222

目录
相关文章
|
1月前
|
SQL
sql server模糊查询、分组
sql server模糊查询、分组
12 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
105 1
|
1月前
|
SQL 存储 BI
sql server 2012远程链接的方法及步骤
sql server 2012远程链接的方法及步骤
20 1
|
8天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
103456 0
|
1月前
|
SQL 存储 Python
Microsoft SQL Server 编写汉字转拼音函数
Microsoft SQL Server 编写汉字转拼音函数
|
1月前
|
SQL 存储 Kubernetes
Seata常见问题之mybatisplus的批量插入方法报SQL错误如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
39 0
|
1月前
|
SQL 存储 Apache
在 Apache Flink SQL 中,并没有内置的 GROUP_CONCAT 函数
【2月更文挑战第16天】在 Apache Flink SQL 中,并没有内置的 GROUP_CONCAT 函数
200 2
|
1月前
|
SQL 存储 关系型数据库
MySQL 常用30种SQL查询语句优化方法
MySQL 常用30种SQL查询语句优化方法
76 0
|
2月前
|
SQL 存储
SQL Server基本函数
SQL Server基本函数
|
2月前
|
SQL 安全 关系型数据库
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
36 0