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

目录
相关文章
|
5月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
663 0
|
1月前
|
SQL 人工智能 数据挖掘
如何在`score`表中正确使用`COUNT`和`AVG`函数?SQL聚合函数COUNT与AVG使用指南
本文三桥君通过score表实例解析SQL聚合函数COUNT和AVG的常见用法。详解COUNT(studentNo)、COUNT(score)、COUNT()的区别,以及AVG函数对数值/字符型字段的不同处理,特别指出AVG()是无效语法。实战部分提供6个典型查询案例及结果,包含创建表、插入数据的完整SQL代码。产品专家三桥君强调正确理解函数特性(如空值处理、字段类型限制)对数据分析的重要性,帮助开发者避免常见误区,提升查询效率。
138 0
|
4月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
310 18
|
4月前
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
108 9
|
5月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
166 12
|
5月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
6月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
142 16
|
10月前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
409 71
|
10月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
392 4
|
10月前
|
SQL BI 数据库
SQL操作的一些基本方法
【10月更文挑战第27天】SQL操作的一些基本方法
143 3