Sql server 2012 如何在T-Sql中查找逗号分隔的另一列的数值?

Sql server 2012 如何在T-Sql中查找逗号分隔的另一列的数值?,sql-server-2012,Sql Server 2012,我有一个包含3个字段的表,如下所示,只想选择[NewFacility]中有匹配[Facility]值的行 NewFacility字段的数值用逗号分隔 本表: Item Facility NewFacility Car 1 1 Van 1 2,4 Bus 3 2,4 Truck 4 2,3,4 预期结果: Item Facility NewFacility Car

我有一个包含3个字段的表,如下所示,只想选择[NewFacility]中有匹配[Facility]值的行

NewFacility字段的数值用逗号分隔

本表:

Item    Facility    NewFacility
Car 1               1
Van 1               2,4
Bus 3               2,4
Truck   4           2,3,4
预期结果:

Item    Facility    NewFacility
Car 1               1
Truck   4           2,3,4
表信息

有关您的具体示例:

SELECT Item
     , Facility
     , NewFacility
     , ISNULL(i.value('n[1]','varchar(10)'), '') 
     , ISNULL(i.value('n[2]','varchar(10)'), '') 
     , ISNULL(i.value('n[3]','varchar(10)'), '') 
FROM (SELECT Item
           , Facility
           , NewFacility
           , CONVERT(XML,'<r><n>' + REPLACE(NewFacility, ',', '</n><n>') + '</n></r>') AS X 
      FROM [Table_Name])  Spt 
CROSS APPLY Spt.X.nodes('/r') x(i) 
WHERE Facility in (i.value('n[1]','varchar(10)')
                , i.value('n[2]','varchar(10)') 
                , i.value('n[3]','varchar(10)')) 
选择项目
,设施
,新设施
,ISNULL(i.value('n[1]”,'varchar(10)”,“”)
,ISNULL(i.value('n[2]”,'varchar(10)”,“”)
,ISNULL(i.value('n[3]”,'varchar(10)”,“”)
从(选择项目
,设施
,新设施
,将(XML,“+替换(NewFacility,”,“)+”)转换为X
来自[表名称])标准贯入试验
交叉应用Spt.X.nodes('/r')X(i)
其中,贷款(i.value('n[1]”,'varchar(10)'
,i.value('n[2]”,'varchar(10)'
,i.value('n[3],'varchar(10'))

其工作原理是将字符串转换为XML,并将逗号分隔的字符串作为一系列节点进行访问。对于每个潜在节点,您必须使用另一个“n[x]”值对位置进行硬编码,或者提出一个迭代解决方案,以穿透所有位置,例如,设施数量不断增加。

在列中存储逗号分隔的值列表是一个糟糕的设计决策。
项是否可以重复值?同意糟糕的设计。