2009-10-24 38 views
3

我有一個表與特定的列,其中有一列包含逗號分隔值如測試,考試,結果,其他如何比較逗號分隔值的兩列值?

我會傳遞一個字符串,如結果,樣本,未知,額外作爲存儲過程的參數。然後我想通過檢查此字符串中的每個短語來獲取相關記錄。

例如:

表A

ID  Name    Words 
1   samson    test,exam,result,other 
2   john    sample,no query 
3   smith    tester,SE 

現在我想搜索結果,樣品,未知的,羣衆演員

那麼結果應該是

ID  Name    Words 
1   samson    test,exam,result,other 
2   john    sample,no query 

因爲在第一個記錄結果匹配和在第二個記錄樣本匹配。

+1

你用什麼sql引擎? – 2009-10-24 16:14:18

+5

我會考慮修復我的數據庫設計。 – Joe 2009-10-24 17:07:46

+0

你如何要求那些有'測試,考試,結果,其他'的人作爲一組結果?這是一個次優設計。 – 2009-10-24 23:09:17

回答

1

我個人認爲你會想看看你的應用程序/架構,仔細想想你是否真的想在數據庫或應用程序中這樣做。如果它不合適或不是一個選項,那麼你需要創建一個自定義函數。這裏的文章中的代碼應該很容易修改,做你想做什麼:

Quick T-Sql to parse a delimited string(也期待在評論的代碼)

7

這不是一個偉大的設計,你知道的。更好地將單詞分成單獨的表格(ID,單詞)。

也就是說,這應該做的伎倆:

set nocount on 
declare @words varchar(max) = 'result,sample,unknown,extras' 

declare @split table (word varchar(64)) 
declare @word varchar(64), @start int, @end int, @stop int 

-- string split in 8 lines 
select @words += ',', @start = 1, @stop = len(@words)+1 
while @start < @stop begin 
    select 
    @end = charindex(',',@words,@start) 
    , @word = rtrim(ltrim(substring(@words,@start,@[email protected]))) 
    , @start = @end+1 
    insert @split values (@word) 
end 

select * from TableA a 
where exists (
    select * from @split w 
    where charindex(','+w.word+',',','+a.words+',') > 0 
) 

我可以在DBA地獄燃燒提供你這個!

編輯:替換餡料w/SUBSTRING切片,長列表上快一個數量級。

+0

考慮點燃篝火下的火炬,彼得...... D – 2009-10-24 23:07:45

+1

嘿。我認爲這是很好的你發佈這個 - 作爲一個很好的例子說明爲什麼不應該這樣設計的東西。 – SquareCog 2009-10-24 23:14:53

+2

我同意設計可以正確完成,但不幸的是,我們中的一些人可能會遇到這類問題,並且沒有能夠改變某人的不良設計的奢侈品。感謝您發佈這個! :) – Ryan 2014-01-02 22:41:05

0

就像其他人已經說過的 - 你有什麼不好的設計。考慮使用適當的關係來表示這些事情。

話雖這麼說,這裏是如何做到這一點使用SQL Server的一個詳細的文章: http://www.sommarskog.se/arrays-in-sql-2005.html

有一件事至今還沒有一個已覆蓋,因爲它往往是一個非常糟糕的主意 - 但是,你是已經在處理一個壞主意,有時候兩個錯誤是正確的 - 就是提取與任何字符串匹配的所有行(使用LIKE或其他類型),然後在客戶端自己完成交集。如果你的字符串非常罕見並且高度相關,這可能工作得很好;在大多數情況下,這將是非常糟糕的。