sql 字符串按某分隔符拆分函数

本文介绍了一个用于SQL的自定义函数splitStr,该函数能够将一个包含特定分隔符的字符串拆分成多个部分,并存储在一个表格变量中。通过使用这个函数,可以轻松地处理复杂的字符串操作任务。
CREATE FUNCTION splitStr
(
@String NVARCHAR(4000),
@Separator NVARCHAR(10)
)
RETURNS @strTable TABLE (strVal NVarchar(4000))
BEGIN
DECLARE @occu INT,
@tempVal NVARCHAR(4000),
@Counter INT
SET @Counter=0
IF SUBSTRING(@String,LEN(@String),1)<>@Separator
SET @String=@String+@Separator
SET @occu=(DATALENGTH(REPLACE(@String,@Separator,@Separator+'#'))-DATALENGTH(@String))/DATALENGTH(@Separator)
SET @tempVal=@String
WHILE @Counter<=@occu
BEGIN
SET @Counter=@Counter+1
IF LEN(SUBSTRING(@tempVal,1,CHARINDEX(@Separator,@tempVal)-1))>0
INSERT @strTable
       ( strVal )
VALUES  (SUBSTRING(@tempVal,1,CHARINDEX(@Separator,@tempVal)-1))
SET @tempVal=SUBSTRING(@tempVal,CHARINDEX(@Separator,@tempVal)+1,4000)
IF LEN(@tempVal)=0
BREAK
END
RETURN

END
SQL Server 中,可以通过递归 `CTE(Common Table Expression)` 实现按照指定分隔符字符串进行拆分。该方法适用于不支持内置函数 `STRING_SPLIT()` 的旧版本 SQL Server 或需要更灵活控制拆分逻辑的场景。 以下是一个使用递归 CTE 按照逗号 `,` 作为分隔符拆分字符串的示例: ```sql DECLARE @input NVARCHAR(MAX) = 'Apple,Banana,Orange,Grape'; WITH SplitCTE AS ( SELECT CAST(1 AS INT) AS start_pos, CHARINDEX(',', @input + ',', 1) AS end_pos, 1 AS level UNION ALL SELECT end_pos + 1, CHARINDEX(',', @input + ',', end_pos + 1), level + 1 FROM SplitCTE WHERE end_pos < LEN(@input) + 1 ) SELECT SUBSTRING(@input, start_pos, end_pos - start_pos) AS split_value FROM SplitCTE; ``` ### 示例说明: - 使用 `CHARINDEX` 函数查找分隔符 `,` 的位置。 - 初始查询中设置第一个字符开始的位置为 `start_pos = 1`,并找到第一个分隔符的位置作为 `end_pos`。 - 在递归部分,通过 `end_pos + 1` 开始下一次查找,并更新 `level` 以防止无限递归。 - 最终从原始字符串中提取子串 `SUBSTRING(@input, start_pos, end_pos - start_pos)` 作为拆分结果[^3]。 如果希望将此逻辑封装成可重用的函数,可以定义一个表值函数如下: ```sql CREATE FUNCTION dbo.SplitStringRecursive (@input NVARCHAR(MAX), @delimiter CHAR(1)) RETURNS TABLE AS RETURN ( WITH SplitCTE AS ( SELECT CAST(1 AS INT) AS start_pos, CHARINDEX(@delimiter, @input + @delimiter, 1) AS end_pos, 1 AS level UNION ALL SELECT end_pos + 1, CHARINDEX(@delimiter, @input + @delimiter, end_pos + 1), level + 1 FROM SplitCTE WHERE end_pos < LEN(@input) + 1 ) SELECT SUBSTRING(@input, start_pos, end_pos - start_pos) AS value FROM SplitCTE ); ``` 调用方式如下: ```sql SELECT value FROM dbo.SplitStringRecursive('Apple,Banana,Orange,Grape', ','); ``` 此方法具有良好的可扩展性,适用于多行记录字段的拆分处理,同时允许用户自定义分隔符[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITGiven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值