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

时间:2017-08-06 17:23:50

标签: tsql 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个字符,等等。

    非常感谢任何帮助。

2 个答案:

答案 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;