从分号分隔的varchar列中提取元素

时间:2014-06-05 21:47:08

标签: sql sql-server

我有一个表,其中一列是一个分号分隔的值集。我想查询在该列中具有我的一个值的所有行,并将该值作为结果集的一部分提取。例如

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

如果我关心的值在集合中[Me-X,Me-Y,Me-Z](这是一个已知的集合,但它没有存储在任何地方),我想选择名称和值来自Tags列。所以这样的选择会返回:

Alice, Me-X
Janet, Me-Y

当然,用这样的东西获取记录和所有标签是微不足道的:

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

...但是将Tags列拆分并拔出标签是我不确定该怎么做的事情。我环顾四周,在SQL中分割字符串seems like不太理想。我无法进行架构更改或将SPROCS添加到数据库这一事实加剧了这种情况。

有没有人知道如何在这些限制条件下解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您只想选择要搜索的标记,请尝试此操作(这实际上并不是从表中选择标记值,但值是在那里,因此它位于该点旁边

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

----修改

抱歉,我刚刚再次阅读了这个问题并注意到你需要一组值

答案 1 :(得分:0)

如果您有所有标签的列表,则可以执行以下操作:

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

现在我已经说过,将字符串存储在字符串中是一个非常非常非常糟糕的主意。 SQL具有用于存储列表的这种出色的数据结构。它被称为表。在这种情况下,您需要一个联结表,每个名称一行,每个标记一行。我确实理解有时你​​不能改变数据结构并且卡住了,但是如果可以的话,引入一个联结/关联表。