我试图查询我的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
答案 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}}。