2015-01-14 210 views
0

我有以下字符串。文本搜索字符串

汽車,公交車,自行車,房子

我想這些拆分爲單獨的字符串,並在where子句所以它想這樣使用它們:

SELECT [text] 
FROM [table] 
WHERE 
text LIKE 'bus' 
or text LIKE 'car' 
or text LIKE 'bike' 
or text LIKE 'house' 

將如何您將瀏覽原始字符串並將它們拆分爲單個子字符串。原始文本字符串作爲變量從GUI傳遞。到目前爲止,我們有這個

REPLACE(LEFT('%BIKE, BUS, HOUSE%',CHARINDEX(',','%BIKE, BUS, HOUSE%')),',','%'), 
REPLACE(SUBSTRING('%BIKE, BUS, HOUSE%',CHARINDEX(',','%LADDER, BA%'),LEN('%BIKE, BUS, HOUSE%')),',','%'), 

但只帶回第一個逗號之前的子串並後保留一切。例如'自行車'和'汽車,公共汽車,房子'。

任何想法?

+1

您使用的是哪種數據庫服務器?它是SQL Server嗎? – Donal

+0

這是用編程語言來做這個選項嗎? (PHP,Python等) – mopo922

+0

是SQL Server 2008r2 –

回答

1

使用LINQ與PredicateBuilder(http://www.albahari.com/nutshell/predicatebuilder.aspx

(樣本 - 我不得不郵編得心應手錶)

var codes = "77,88,99".Split(','); 

var predicate = PredicateBuilder.False<ZipCodes>(); 
foreach(var c in codes) 
    predicate = predicate.Or(z=>z.ZipCode.Contains(c)); 

var answer = this.ZipCodes.Where(predicate).ToList(); 
1

您可以使用XML功能把你的字符串到一個數組,然後簡單地JOIN使用通配符:

DECLARE @string VARCHAR(100) = 'car, bus, bike, house' 
;WITH cte AS (SELECT RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) AS Txt  
       FROM (SELECT CAST ('<M>' + REPLACE(@string, ',', '</M><M>') + '</M>' AS XML) AS DATA 
      ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)) 
SELECT DISTINCT [text] 
FROM [table] a 
JOIN cte b 
    ON a.[text] LIKE '%'+b.Txt+'%' 

理想情況下,你會通過你的陣列到一個表變量,只需要運行JOIN在底部。

+0

我做了大量的ETL工作,每天使用這個函數。 –