2017-08-06 54 views
-1

我一直在寻找一个问题,那就是我需要在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. 文本有两个分隔符和有第三个值

的主要挑战是,当存在时,分隔符根据表中的值移动。值1-9使其显示为字符串中的第二个字符,值10-24使其显示为第三等。

任何帮助将不胜感激。

+0

如何从杰夫模式N [CSV分配器(http://www.sqlservercentral.com/articles此不同/ Tally + Table/72993 /),而不是只使用半个冒号? – HABO

+0

大家好,谢谢你的回复。他们帮助我找到了我需要的解决方案。我试图在我的select语句中做所有事情,但是我发现了一个我可以调用的函数,它会将字符串分开: – Mike

回答

-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; 
+0

这不是一个完整的解决方案,因为它只能用于单个值。为了抵制表中的所有值,逻辑需要被封装到函数或CROSS APPLY /子查询中。 –

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