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

目录
相关文章
|
25天前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
144 71
|
1月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
58 4
|
1月前
|
SQL BI 数据库
SQL操作的一些基本方法
【10月更文挑战第27天】SQL操作的一些基本方法
41 3
|
1月前
|
SQL 监控 固态存储
SQL优化有哪些方法?
【10月更文挑战第27天】SQL优化有哪些方法?
44 3
|
2月前
|
SQL 数据库 索引
SQL语句实现投影连接:方法与技巧详解
在SQL数据库查询中,投影和连接是两个核心概念
|
2月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
2月前
|
SQL 安全 关系型数据库
SQL语句中表名通配符的使用技巧与方法
在SQL查询中,通配符通常用于匹配字符串数据,如列值中的部分字符
|
2月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
2月前
|
SQL 数据库 索引
SQL语句实现投影连接:技巧与方法详解
在SQL数据库操作中,投影连接(Projection Join)是一种常见的数据查询技术,它结合了投影(Projection)和连接(Join)两种操作
|
2月前
|
SQL 监控 数据库
SQL语句性能分析技巧与方法
在数据库管理中,分析SQL语句的性能是优化数据库查询、提升系统响应速度的重要步骤