【问题标题】:Reverse Concat - Split function反向 Concat - 拆分功能
【发布时间】:2015-08-04 13:38:49
【问题描述】:

我有一个表,它有一个值列,将数据列为: 第 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

但它不起作用。有人可以给我一些关于我应该如何工作的指导吗?

【问题讨论】:

  • not working 是什么意思?
  • 我运行视图时的结果仍然是原始结果:第 1 行:'01'、'02'、'03' 而不是第 1 行 '01 第 2 行 02 第 3 行 03。我想要一个row 以逗号分隔的每个值分成一行。
  • 您正在对VALUE 执行SELECT,这就是它仍在返回原件的原因。 SELECT 来自 dbo.split 的字段。 SELECT DISTINCT Item.Item ...

标签: sql sql-server function split


【解决方案1】:

这是因为您使用的是 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

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2023-03-17
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多