Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从分号分隔的varchar列中提取元素_Sql_Sql Server - Fatal编程技术网

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电子表格数据源中的查询。