SQL Server 2012 查找分隔符之前和之后的文本,有时没有分隔符



我一直在玩弄一个问题,我需要在SQL Server 2012中分解一个字符串并测试它可能包含或不包含的值。这些值(如果存在(将由最多两个不同的;符号分隔。

  • 当什么都没有时,它将是空白的。
  • 当存在单个值时,它将在没有分隔符的情况下显示。
  • 当有两个或更多(最多 3 个(时,它们将由分隔符分隔。

正如我所说,如果记录中没有任何内容,它将是空白的。以下是数据如何产生的一些示例:

' ',
'1',
'24',
'15;1;24',
'10;1;22',
'5;1;7',
'12;1',
'10;12',
'1;5',
'1;1;1',
'15;20;22'

我已经搜索了论坛并找到了很多线索,但考虑到所有潜在的数据价值,我无法提出一个完整的解决方案。从本质上讲,我想将其分解为 3 个单独的值。

  1. 第一个分隔符之前的文本,或者如果没有分隔符,则仅显示文本。

  2. 在有两个分隔符的情况下,第一个分隔符之后和第二个分隔符之前的文本。

    以下方法始终如一地有效:

    substring(SUBSTRING(Food_Desc, charindex(';', Food_Desc) + 1, 4), 0,
    charindex(';', SUBSTRING(Food_Desc, charindex(';', Food_Desc) + 1, 4))) as [Middle]
    
  3. 第二个分隔符
  4. 后面的文本在偶数中有两个分隔符,还有第三个值

主要挑战是分隔符(如果存在(会根据表中的值而移动。 值 1-9 使其显示为字符串中的第二个字符,值 10-24 使其显示为第 3 个字符,依此类推。

任何帮助将不胜感激。

如果你有一个写得很好的t-sql拆分器函数,这很简单。对于这个解决方案,我使用的是Jeff Moden的dedicsplit8k。

示例数据和解决方案

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

下面是类似问题的修改版本如何拆分字符串以便我可以访问项目 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;

最新更新