2014-01-29 2 views
12

У меня есть строка в базе данных, разделенная запятой. Как «яблоко, банан, ананас, виноград» Мне нужно разбить эту строку на основе запятой и прокрутить ее. Так как в sql-сервере нет встроенной функции, есть ли эффективный способ достижения этой цели.Разделение строки в sql-сервере

+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' to обрабатывать разделители с завершающими пробелами, такими как '' ''и'', ''. –

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.

Смежные вопросы