返回ID在子查询MSSQL中以分号分隔的字符串的行

时间:2016-02-04 15:38:20

标签: sql-server

我试图查询我的sql数据库,以返回包含在单独的表列中的ID的所有行。项目ID列表保存在Feedback列的Project_ID表中,数据类型为varchar。我试图从Projects表返回行,其中ID保存在Project_ID列中,数据类型为varchar。

我正在使用查询

这样做
SELECT * FROM Projects WHERE Project_ID IN (
    SELECT Project_ID FROM Feedback WHERE ID = 268 and Project_ID IS NOT NULL
)

当我运行此查询时,系统会返回消息:

Conversion failed when converting the varchar value '36;10;59' to data type int

1 个答案:

答案 0 :(得分:2)

这是规范化数据重要性的另一个例子 在一列中保留多个数据点几乎从来都不是正确的设计,几乎从来没有我的意思是大约99.9999%。

如果您无法规范化数据库,则可以使用以下解决方法:

SELECT * 
FROM Projects p
WHERE EXISTS (
    SELECT Project_ID 
    FROM Feedback F WHERE ID = 268 
    AND Project_ID IS NOT NULL
    AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)

您不能使用IN运算符,因为它期望逗号分隔的值列表,而您尝试为其提供由分号分隔的单个值。即使Project_ID中的值由逗号分隔,它仍然无效。

我在两个表中;的每一侧添加了Project_ID的原因是,LIKE运算符会以true运算符返回Projects.Project_Id它在Feedback.Project_Id内找到;的位置。您必须将Projects.Project_Id添加到LIKE,以防止true在找到与分隔字符串中的数字部分匹配的数字时返回LIKE 。考虑在包含1; 112; 455的字符串中查找12 - 不将分隔符添加到搜索值(在此示例中为12),true运算符将返回{{1}}。