2015-08-04 6 views
2

У меня есть таблица, в которой есть столбец значений, который перечисляет данные как: Строка 1: '00', '01', '02', '03' Строка 2: '03', «02», «09», «08»Reverse Concat - Split function

у меня есть пара расщепленных функций

 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 Row 3: 02 Row 4: 03

мой взгляд довольно много:

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

Но это не работает. Может кто-нибудь одолжить мне какое-то направление, как я должен это работать?

+0

Что означает '' не работает'? –

+0

Мои результаты, когда я запускаю представление, по-прежнему являются оригиналом: строка 1: '01', '02', '03', а не строка 1 '01 строка 2 02 строка 3 03. Я хочу, чтобы одна строка разбивалась на строку для каждое значение разделяется запятой. –

+0

Вы делаете 'SELECT' на' VALUE', поэтому он все еще возвращает оригинал. 'SELECT' вместо поля' dbo.split'. 'SELECT DISTINCT Item.Item ...' –

ответ

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' 

Для другой строки сплиттер, вы можете прочитать эту article Аарон Бертрана.