我一直在玩一个问题,我需要在SQL Server 2012中拆分一个字符串并测试它可能包含或不包含的值。这些值(如果存在)将由最多两个不同的;
符号分隔。
正如我所说,如果记录中没有任何内容,那么它将是空白的。以下是数据可能会遇到的一些示例:
' ',
'1',
'24',
'15;1;24',
'10;1;22',
'5;1;7',
'12;1',
'10;12',
'1;5',
'1;1;1',
'15;20;22'
我搜索了论坛并发现了许多线索,但鉴于所有潜在的数据值,我无法提出完整的解决方案。基本上,我想把它分成3个单独的值。
第一个分隔符之前的文本或没有分隔符的文本,只是文本。
第一个分隔符之后的文本和第二个分隔符之前的文本,其中有两个分隔符。
以下内容始终如一:
substring(SUBSTRING(Food_Desc, charindex(';', Food_Desc) + 1, 4), 0,
charindex(';', SUBSTRING(Food_Desc, charindex(';', Food_Desc) + 1, 4))) as [Middle]
第二个分隔符之后的文本,即使有两个分隔符,也有第三个值
主要挑战是分隔符(如果存在)根据表中的值移动。值1-9使其显示为字符串中的第二个字符,值10-24使其显示为第3个字符,等等。
非常感谢任何帮助。
答案 0 :(得分:0)
如果你有一个写得很好的t-sql splitter函数,这很简单。对于这个解决方案,我使用了Jeff Moden的delimitedsplit8k。
示例数据和解决方案
DECLARE @table table (someid int identity, sometext varchar(100));
INSERT @table VALUES (' '),('1'),('24'),('15;1;24'),('10;1;22'),
('5;1;7'),('12;1'),('10;12'),('1;5'),('1;1;1'),('15;20;22');
SELECT
someid,
sometext,
ItemNumber,
Item
FROM @table
CROSS APPLY dbo.DelimitedSplit8K_LEAD(sometext, ';');
<强>结果
someid sometext ItemNumber Item
----------- ----------------- ----------- --------
1 1
2 1 1 1
3 24 1 24
4 15;1;24 1 15
4 15;1;24 2 1
4 15;1;24 3 24
5 10;1;22 1 10
5 10;1;22 2 1
5 10;1;22 3 22
6 5;1;7 1 5
6 5;1;7 2 1
6 5;1;7 3 7
7 12;1 1 12
7 12;1 2 1
8 10;12 1 10
8 10;12 2 12
9 1;5 1 1
9 1;5 2 5
10 1;1;1 1 1
10 1;1;1 2 1
10 1;1;1 3 1
11 15;20;22 1 15
11 15;20;22 2 20
11 15;20;22 3 22
答案 1 :(得分:-1)
以下是类似问题How do I split a string so I can access item x?的修改版本。将@sample
的文本值更改为列出的每种可能性似乎对我有用。
DECLARE @sample VARCHAR(200) = '15;20;22';
DECLARE @individual VARCHAR(20) = NULL;
WHILE LEN(@sample) > 0
BEGIN
IF PATINDEX('%;%', @sample) > 0
BEGIN
SET @individual = SUBSTRING(@sample, 0, PATINDEX('%;%', @sample));
SELECT @individual;
SET @sample = SUBSTRING(@sample, LEN(@individual + ';') + 1, LEN(@sample));
END;
ELSE
BEGIN
SET @individual = @sample;
SET @sample = NULL;
SELECT @individual;
END;
END;