2014-06-05 83 views
0

我有一個表,其中一列是分號分隔的一組值。我想要查詢在該列中具有其中一個值的所有行,並將該值作爲結果集的一部分提取。例如。從分號分隔的varchar列中提取元素

MyTable 
[Name], [Tags] 
Bob, A;B;C 
Alice, Me-X 
Janet, Me-Y;A 

如果我關心的值在集合[ME-X,我-Y,ME-Z](這是一組已知的,但它沒有存儲任何地方),我想選擇的名稱和「標籤」列中的值。所以,這樣的選擇將返回:

Alice, Me-X 
Janet, Me-Y 

Curently,是微不足道的得到記錄和所有的標籤像這樣的東西:

SELECT [Name], [Tags] FROM MyTable WHERE [Tags] LIKE '%Me-%' 

...但splitthing的標籤欄和拉出標籤是我不知道該怎麼做的。我環顧四周,它在SQL中拆分字符串seems like並不理想。由於我無法進行架構更改或將SPROCS添加到數據庫,這一事實進一步惡化了這一點。

有沒有人知道一個更好的方式,以便我可以在這些限制下解決這個問題?

回答

0

如果你只是想選擇您正在搜索試試這個(這實際上不是選擇從表中的變量值的標籤,但該值在那裏,這樣是跑題

DECLARE @myTag nvarchar(10) 
SET @myTag='Me' 
SELECT [Name], @myTag [Tags] 
FROM MyTable 
WHERE [Tags] LIKE '%;'[email protected]+ ';%' --if your tag is in the middle of the string 
OR [Tags] LIKE '%;'[email protected] --if it ends with your tag 
OR [Tags] LIKE @myTag+ ';%' --it it starts with your tag 

----編輯

對不起,我剛剛看了一遍這個問題,發現你想要的一組值

+0

我可以保證在特定記錄中只有__我的標籤,但它可能是我擁有的幾十個標籤中的任何一個。 –

+0

您以查詢行數1000+,100000+查詢此表的大小是多少?以及你運行這個查詢的頻率如何,它將成爲應用程序的一部分,或偶爾運行 – Hedinn

+0

〜300,000,每天一次或兩次。這是Excel電子表格數據源中的查詢。 –

0

如果你把所有標籤的列表,你可以這樣做:

select name, tag 
from table t join 
    tags 
    on ';'+tags.tag+';' like '%;'+t.tags+';%' ; 

現在我已經說過了,將事情列表存儲在字符串中是一個非常非常糟糕的主意。 SQL有這個偉大的數據結構來存儲列表。它被稱爲表格。在這種情況下,您需要一個聯結表,每個名稱一行,每個標記一行。我明白,有時你不能改變數據結構並被卡住,但如果可以的話,引入一個聯結/關聯表。

+0

不幸的是,我沒有一個所有標籤的列表。這是一個免費的文本字段,人們可以通過前端輸入他們想要的內容。無論用戶喜歡什麼原因,用戶都可以用任何喜歡的東西「標記」事物我繼承了以這種方式查詢和使用該字段的責任。我只知道所有的我的標籤。 –