2011-09-12 80 views
1

我已經簡單的數據來像這樣:sql-server-2005:如何執行分隔管道分隔字符串變量?

declare @string varchar(500) = "val1|val2|val3" 

我怎麼能拆了這一點,爲的CTE或相似的,所以我能用戶它在以後的查詢的內容:

select col1 from table where col2 = @valFromCTE 
+0

使用分割功能。你可以在我的答案在這裏看到一個例子:http://stackoverflow.com/questions/7274514/sql-query-to-match-keywords –

+0

好的,我有一點麻煩,因爲我的原始輸入字符串通過 – Cavide

+0

對,我正在看數字表,這是我絆倒 – Cavide

回答

1

這是一個有用和簡單的方式來查詢分隔字符串就好像它是一個表。

來自 http://www.mindsdoor.net/SQLTsql/ParseCSVString.html

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fn_ParseCSVString]') and xtype in (N'FN', N'IF', N'TF')) 
drop function [dbo].[fn_ParseCSVString] 
GO 


create function fn_ParseCSVString 
(
@CSVString varchar(8000) , 
@Delimiter varchar(10) 
) 
returns @tbl table (s varchar(1000)) 
as 
/* 
select * from dbo.fn_ParseCSVString ('qwe,c,rew,c,wer', ',c,') 
*/ 
begin 
declare @i int , 
    @j int 
    select @i = 1 
    while @i <= len(@CSVString) 
    begin 
     select @j = charindex(@Delimiter, @CSVString, @i) 
     if @j = 0 
     begin 
      select @j = len(@CSVString) + 1 
     end 
     insert @tbl select substring(@CSVString, @i, @j - @i) 
     select @i = @j + len(@Delimiter) 
    end 
    return 
end 


GO 
+1

只是爲了迂腐,而在小字符串它可能是不相關的,我會意識到循環方法對大字符串的性能影響。雖然我爲'INT'值做了這個,但我比較了去年各種拆分方法的性能,並且應該檢查結果:http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a -list-的-整數-另一個-roundup.aspx –