2010-11-27 94 views
2

时转换失败我有表类别(c)和另一个表(x),其中的列可以包含以逗号分隔的cat ID作为varchar数据类型。我想选择相关的类别,但是我的错误是“将varchar值5'转换为数据类型int时转换失败。”试图选择时:将varchar值'1'转换为数据类型int

SELECT ID, Title FROM c WHERE ID IN (SELECT catIDs FROM x WHERE ID=any); 

子查询返回的数据,如“1,3,4”

+1

如果将WHERE ID IN替换为WHERE CAST(ID as varchar(5))IN,会发生什么情况? – CarneyCode 2010-11-27 09:42:06

+0

我同意@Traroth - 以逗号分隔值的字符串形式返回的ID列表表明**数据库设计有问题**。 “x”表中是否真的有`catIDs`列?或者,这可能只是一个例子,实际上`1,3,4`是从存储的rpocedure返回的,或者从平面文件中检索到的? – 2010-11-27 10:07:11

回答

4

您需要将子查询返回的1,3,4字符串拆分为单独的int值。 SQL Server没有内置函数来执行此操作,但可以使用this user-defined function

在数据库中创建功能dbo.Split然后如下重新编写查询:

SELECT ID, Title 
FROM c 
WHERE ID IN 
    (
    SELECT s 
    FROM dbo.Split(',', '1,3,4') 
) 

我替换示例中的子查询结果1,3,4缩短查询,并使其更容易理解。

1

如果我得到它的权利,你确实有,如“1,3,4”的价值观在您的专栏catIDs 。所以你应该在你的子查询中选择一个子字符串。顺便说一句,我不是MS SQL Server专家,但它可能是一个不好的数据库设计。我不确定RDBMS引擎会在这种情况下使用索引...

相关问题