2014-01-29 156 views
12

我在其中由逗号separated.Like 数据库字符串“苹果,香蕉,菠萝,葡萄” 我需要逗号的基础上拆分此字符串,并通过this.Since迭代在sql server中没有内置函数,是否有任何有效的方法可以达到这个目标。拆分SQL Server中的字符串

+0

您使用哪种服务器端语言? – Yani

+0

检查这个http://www.queryingsql.com/2013/09/querying-microsoft-sql-server-functions.html – Rohan

回答

16

试试这个功能

CREATE FUNCTION [dbo].[func_Split] 
    ( 
    @DelimitedString varchar(8000), 
    @Delimiter    varchar(100) 
    ) 
RETURNS @tblArray TABLE 
    (
    ElementID int IDENTITY(1,1), -- Array index 
    Element  varchar(1000)    -- Array element contents 
    ) 
AS 
BEGIN 

    -- Local Variable Declarations 
    -- --------------------------- 
    DECLARE @Index  smallint, 
        @Start  smallint, 
        @DelSize smallint 

    SET @DelSize = LEN(@Delimiter) 

    -- Loop through source string and add elements to destination table array 
    -- ---------------------------------------------------------------------- 
    WHILE LEN(@DelimitedString) > 0 
    BEGIN 

     SET @Index = CHARINDEX(@Delimiter, @DelimitedString) 

     IF @Index = 0 
      BEGIN 

       INSERT INTO 
        @tblArray 
        (Element) 
       VALUES 
        (LTRIM(RTRIM(@DelimitedString))) 

       BREAK 
      END 
     ELSE 
      BEGIN 

       INSERT INTO 
        @tblArray 
        (Element) 
       VALUES 
        (LTRIM(RTRIM(SUBSTRING(@DelimitedString, 1,@Index - 1)))) 

       SET @Start = @Index + @DelSize 
       SET @DelimitedString = SUBSTRING(@DelimitedString, @Start , LEN(@DelimitedString) - @Start + 1) 

      END 
    END 

    RETURN 
END 

使用示例 - 简单的传递函数的逗号分隔的字符串,以及你所需要的分隔符。

DECLARE @SQLStr varchar(100) 
SELECT @SQLStr = 'Mickey Mouse, Goofy, Donald Duck, Pluto, Minnie Mouse' 

SELECT 
    * 
FROM 
    dbo.func_split(@SQLStr, ',') 

结果会是这样

Result

+1

我会使用'SET @DelSize = LEN(@Delimiter +'x') - 1'来处理带有尾随空格的分隔符,例如''''和'',''。 –

4

您可以将数据转换为XML,通过自定义标签替换逗号,在这种情况下,为<w>字。

create table t(col varchar(255)); 
insert into t values ('apple,banana,pineapple,grapes'); 
insert into t values ('car,bike,airplane'); 

select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue 
    from t 

它返回

|            XMLVALUE | 
|--------------------------------------------------------| 
| <w>apple</w><w>banana</w><w>pineapple</w><w>grapes</w> | 
|     <w>car</w><w>bike</w><w>airplane</w> | 

现在,如果你使用此查询的内部XML选择,外部查询可以将它分成不同的行:

解决方案:

select split.xmlTable.value('.', 'varchar(255)') as xmlValue 
from (

    select cast(('<w>' + replace(col, ',', '</w><w>') + '</w>') as xml) as xmlValue 
    from t 

) as xmlTable 
cross apply xmlValue.nodes ('/w') as split(xmlTable); 

Live sqlFiddle

9

...因为在SQL Server中的功能没有内置...

这在当时是真的,你问这个问题,但SQL Server 2016引入了STRING_SPLIT

所以,你可以只使用

SELECT value 
FROM STRING_SPLIT ('apple,banana,pineapple,grapes', ',') 

有一些限制(只接受单个字符分隔符和缺乏指示分离指标是最醒目的任何列)。性能测试的各种限制和有希望的结果在this blog post by Aaron Bertrand