简书链接:sql对某字段以分隔符的进行不足补0转行
文章字数:200,阅读全文大约需要1分钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
	-- 声明输入字符串和临时表
DECLARE @inputString NVARCHAR(MAX) = 'AD_1_D1_2_3_6fff3';
DECLARE @tempTable TABLE (PartNumber INT, PaddedPart NVARCHAR(10));

-- 初始化变量
DECLARE @start INT = 1;
DECLARE @end INT;
DECLARE @part NVARCHAR(MAX);
DECLARE @maxLength INT = 4; -- 假设每个部分要补足到4位
DECLARE @partNumber INT = 1; -- 用于跟踪部分编号

-- 使用 WHILE 循环来分割字符串
WHILE CHARINDEX('_', @inputString, @start) > 0
BEGIN
SET @end = CHARINDEX('_', @inputString, @start);
SET @part = SUBSTRING(@inputString, @start, @end - @start);

-- 插入到临时表,并用0补足长度
INSERT INTO @tempTable (PartNumber, PaddedPart)
VALUES (@partNumber, RIGHT('0000' + @part, @maxLength));

-- 更新部分编号和起始位置以继续下一次循环
SET @partNumber = @partNumber + 1;
SET @start = @end + 1;
END

-- 处理最后一个部分(没有下划线的部分)
IF @start <= LEN(@inputString)
BEGIN
SET @part = SUBSTRING(@inputString, @start, LEN(@inputString) - @start + 1);

-- 插入到临时表,并用0补足长度
INSERT INTO @tempTable (PartNumber, PaddedPart)
VALUES (@partNumber, RIGHT('0000' + @part, @maxLength));
END

-- 查询临时表以查看结果
SELECT * FROM @tempTable;

image.png

纯分割转行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE FUNCTION [dbo].[SplitStringToRow]
(
@str NVARCHAR(4000)
,@char NVARCHAR(10) = ','
)
--create by lozn
RETURNS @SplitStr TABLE
(
ID int IDENTITY PRIMARY KEY
,Value nvarchar(2000)
)
AS
BEGIN
SET @str = @str + @char
WHILE LEN(@str) > 0
BEGIN
INSERT @SplitStr
SELECT SUBSTRING(@str, 1, CHARINDEX(@char, @str) - 1)
SELECT @str = RIGHT(@str, LEN(@str) - CHARINDEX(@char, @str) - (LEN(@char) - 1))
END
RETURN
END