SQL分割字符串详解

简介:
T-SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。
一,用临时表作为数组。



create function f_split(@c varchar(2000),@split varchar(2)) 
returns @t table(col varchar(20)) 
as 
    begin 
    
      while(charindex(@split,@c)<>0) 
        begin 
          insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) 
          set @c = stuff(@c,1,charindex(@split,@c),'') 
        end 
      insert @t(col) values (@c) 
      return 
    end 
go 
    
select * from dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',') 
    
drop function f_split


    col 
-- ------------------     
dfkd   
dfdkdf   
dfdkf   
dffjk   

    
(所影响的行数为   4   行) 
 
二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。
CREATE function Get_StrArrayLength
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
 
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location<>0
begin
   set @start=@location+1
   set @location=charindex(@split,@str,@start)
   set @length=@length+1
end
return @length
end

调用示例:

select dbo.Get_StrArrayLength('78,1,2,3',',')

返回值:4
 
三、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便

CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
 
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
 
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
   set @start=@location+@seed
   set @location=charindex(@split,@str,@start)
   set @next=@next+1
end
if @location =0 select @location =len(@str)+1 
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
 
return substring(@str,@start,@location-@start)
end




调用示例:
select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)

返回值:9
 
三、结合上边两个函数,象数组一样遍历字符串中的元素
 
declare @str varchar(50)
set @str='1,2,3,4,5'
declare @next int 
set @next=1
while @next<=dbo.Get_StrArrayLength(@str,',')
begin
print dbo.Get_StrArrayStrOfIndex(@str,',',@next)
set @next=@next+1
end


调用结果:
1
2
3
4
5 
// -- -----------------------------------------------------------------------------------------------------------------------
select f1,f2,f3,left(A,charindex('_',A)-1)
from 表名 
order by left(A,charindex('_',A)-1)

相关文章
|
前端开发 程序员
程序员也可以很浪漫,精选10个圣诞节特效及源码
最近离圣诞节不远了、整理了一些关于圣诞相关的前端特效网页设计和小游戏的代码送大家、直接上效果吧。 代码过长的 可直接预览获取 [快速预览](https://www.hereitis.cn/articleDetails/969)
程序员也可以很浪漫,精选10个圣诞节特效及源码
|
6月前
|
机器学习/深度学习 编解码 缓存
通义万相首尾帧图模型一键生成特效视频!
本文介绍了阿里通义发布的Wan2.1系列模型及其首尾帧生视频功能。该模型采用先进的DiT架构,通过高效的VAE模型降低运算成本,同时利用Full Attention机制确保生成视频的时间与空间一致性。模型训练分为三个阶段,逐步优化首尾帧生成能力及细节复刻效果。此外,文章展示了具体案例,并详细说明了训练和推理优化方法。目前,该模型已开源。
845 9
|
IDE NoSQL Java
如何搭建springboot脚手架
本文讲述了项目初始化时常见的环境搭建问题,包括IDE的下载和选择,以及版本管理的复杂性。作者分享了在使用不同版本的SpringBoot和SpringCloud时遇到的版本兼容性问题,强调了版本管理的重要性。文章还提到了Maven在解决依赖关系中的作用,以及介绍了SpringBoot的自动配置功能。此外,文章提供了全局异常处理、日志处理、跨域类和响应体的代码示例,并推荐了一些常用的开发工具,如内存版中间件和Java工具库。最后,作者提到在实际工作中,与他人协作时的环境一致性问题也可能带来困扰。
1653 1
|
Java Nacos 数据安全/隐私保护
nacos启动问题之启动时连接报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
4618 101
|
机器学习/深度学习 人工智能 算法
软件测试的未来:AI与自动化的融合之路
随着技术的不断进步,人工智能(AI)和自动化技术在软件测试领域的应用日益增多。本文将探讨AI如何改变软件测试的面貌,以及自动化工具如何助力提升测试效率和准确性。我们将从实际案例出发,分析AI和自动化技术带来的优势与挑战,并展望未来软件测试的发展趋势。
|
监控 Java 持续交付
如何搭建漂亮的 SpringBoot 脚手架?
【10月更文挑战第1天】在快速迭代的软件开发环境中,一个高效、美观且易于维护的 SpringBoot 脚手架是项目成功的关键。本文将详细介绍如何搭建一个既实用又漂亮的 SpringBoot 脚手架,帮助你在工作和学习中提升开发效率。
1863 0
抖音超火的圣诞树代码,html源码分享
抖音超火的圣诞树代码,html源码分享
2712 0
|
Java 测试技术 Spring
Spring Boot中的自定义注解应用
Spring Boot中的自定义注解应用
|
Ubuntu 安全
什么是Ubuntu LTS?与常规版本的区别
Ubuntu LTS和常规版本的主要区别在于支持周期和稳定性。由于LTS版本的支持周期长,更新周期慢,因此它更加稳定,更适合需要长期稳定运行环境的用户或企业使用,如服务器或者企业桌面环境。而常规版本则更频繁地提供新特性和更新,更适合需要最新功能和软件的用户。
1243 0
|
Web App开发 前端开发 Java
解决新版chrome跨域问题:cookie丢失以及samesite属性问题
解决新版chrome跨域问题:cookie丢失以及samesite属性问题
1895 0
解决新版chrome跨域问题:cookie丢失以及samesite属性问题