Sql 从分号分隔的varchar列中提取元素
我有一个表,其中一列是分号分隔的值集。我想查询在该列中包含我的一个值的所有行,并将该值提取为结果集的一部分。例如Sql 从分号分隔的varchar列中提取元素,sql,sql-server,Sql,Sql Server,我有一个表,其中一列是分号分隔的值集。我想查询在该列中包含我的一个值的所有行,并将该值提取为结果集的一部分。例如 MyTable [Name], [Tags] Bob, A;B;C Alice, Me-X Janet, Me-Y;A 如果我关心的值在集合[Me-X,Me-Y,Me-Z]中,这是一个已知集合,但它没有存储在任何位置,我想从标记列中选择名称和值。因此,这样的选择将返回: Alice, Me-X Janet, Me-Y 现在,用这样的东西获取记录和所有标记是很简单的: SELECT
MyTable
[Name], [Tags]
Bob, A;B;C
Alice, Me-X
Janet, Me-Y;A
如果我关心的值在集合[Me-X,Me-Y,Me-Z]中,这是一个已知集合,但它没有存储在任何位置,我想从标记列中选择名称和值。因此,这样的选择将返回:
Alice, Me-X
Janet, Me-Y
现在,用这样的东西获取记录和所有标记是很简单的:
SELECT [Name], [Tags] FROM MyTable WHERE [Tags] LIKE '%Me-%'
。。。但是我不知道如何拆分标签列并拉出标签。我环顾四周,发现在SQL中拆分字符串并不理想。我不能更改模式,也不能向数据库中添加存储过程,这一事实加剧了这种情况
有谁知道在这些限制条件下如何更好地执行此操作的更好方法吗?如果您只想选择要搜索的标记,请尝试此操作,它实际上不是从表中选择标记值,而是值在表中,因此与点无关
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
--编辑
抱歉,我刚刚再次阅读了问题,注意到您需要一组值如果您有一个所有标记的列表,您可以执行以下操作:
select name, tag
from table t join
tags
on ';'+tags.tag+';' like '%;'+t.tags+';%' ;
现在我已经说过了,用字符串存储事物列表是一个非常非常非常糟糕的主意。SQL具有这种用于存储列表的优秀数据结构。它叫桌子。在本例中,您需要一个连接表,每个名称一行,每个标记一行。我确实理解,有时您无法更改数据结构并被卡住,但如果可以,请引入一个连接/关联表。不幸的是,我没有所有标记的列表。这是一个自由文本字段,人们可以通过前端输入他们想要的内容。用户以他们喜欢的任何理由用他们喜欢的任何东西来标记事物。我继承了查询它和以这种方式使用该字段的责任。我只知道我的所有标记。我可以保证在特定记录上只会有我的一个标记,但它可以是我拥有的几十个标记中的任何一个。您查询的这个表的大约大小是多少行,1000+,100000+?您多久运行一次这个查询?它是应用程序的一部分还是偶尔运行?每天运行一次或两次。它是excel电子表格数据源中的查询。