反向Concat - 分割功能

时间:2015-08-04 13:38:49

标签: sql sql-server function split

我有一个表,它有一个值列,将数据列为: 第1行:'00','01','02','03' 第2行:'03','02','09','08'

我有几个分割功能

     FUNCTION [dbo].[udf_Split](@String varchar(MAX), @Delimiter char(1))   
    returns @temptable TABLE (Item varchar(MAX))       
    as       
    begin      
      declare @idx int       
      declare @slice varchar(8000)       

select @idx = 1       
    if len(@String)<1 or @String is null  return       

while @idx<>0       
begin       
    set @idx = charindex(@Delimiter,@String)       
    if @idx!=0       
        set @slice = left(@String,@idx - 1)       
    else       
        set @slice = @String       

    if(len(@slice)>0)  
        insert into @temptable(Item) values(@slice)       

    set @String = right(@String,len(@String) - @idx)       
    if len(@String) = 0 break       
end  return end;

我正在尝试使用该列创建表的视图,然后我希望我的视图结果是一个行列表,每个值都被破坏到它自己的行(并且不同)所以看起来像:(抽搐可以留下或去,现在不关心它们) 第1 00行 第2行:01 第3行:02 第4:03行

我的观点几乎是:

    SELECT DISTINCT VALUE FROM TABLE
    cross apply dbo.split(Value, ',') as Item

但它不起作用。有人能否就我应该如何工作向我提出一些指示?

1 个答案:

答案 0 :(得分:3)

这是因为您SELECT字段为VALUE而不是Item.Item。你应该这样做:

SELECT DISTINCT x.Item
FROM TABLE
CROSS APPLY dbo.split(Value, ',') AS x

此外,您的dbo.split功能并非最佳。有许多方法可以以基于集合的方式拆分字符串,而不是RBAR。以下是使用XML的一种方法:

CREATE FUNCTION dbo.SplitStrings_XML
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );
GO

样本用法:

;WITH CteData(Value) AS(
    SELECT '''00'',''01'',''02'',''03''' UNION ALL
    SELECT '''03'',''02'',''09'',''08'''
)
SELECT DISTINCT x.Item
FROM CteData d
CROSS APPLY dbo.SplitStrings_XML(d.Value, ',') x

结果:

Item
--------
'00'
'01'
'02'
'03'
'08'
'09'

对于其他字符串拆分器,您可以阅读Aaron Bertrand的这个article