2012-10-11 50 views
-4

我有2个疑问是这样的:为什么其中一个查询没有返回行?

查询#1:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN ('6', '8', '9', '10', '12', '14', '110', '106') 

查询#2:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN (SELECT ('6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106')) 

为什么第二个查询不返回行?当第一个查询返回一些行时。

+0

正确当你把''''''放在你以前有''''的地方时,你试图*达到什么目的? – MatBailie

回答

0

第二个查询认为值作为一个字符串

你必须使用“”(单引号)在使用IN子句时,单独的字符值

+0

感谢您的快速回复..现在我怎么会把它作为逗号分隔字符串? – Ashish

+0

你必须尝试像这样的东西声明@str varchar(200)='6,8,9'; exec('SELECT * FROM dbo.Products WHERE CAST(ID AS VARCHAR)in('+ @ str +')') –

0

为什么第二查询返回没有行?当第一个查询返回 某些行时。

因为在第二个查询returns only one string valueIN谓词由SELECT语句返回的值是:

6','8','9','10','12','14','110','106 

所以,你最终将铸造INT ID值只有一个字符串值6','8','9','10','12','14','110','106'比较所以你的查询门槛评估像这样

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) = ''6','8','9','10','12','14','110','106''; 

但是有不同的字符串值在IN子句中的第一个查询:

6 8 9 10 12 14 110 106 

但是,你也没必要投它在将所有varchar:

SELECT * 
FROM dbo.Products 
WHERE ID IN (6, 8, 9, 10, 12, 14, 110, 106) 
2

您的查询#2太多的单引号.. 。

另外:如果ID数值列 - 为什么不使用

SELECT * 
FROM dbo.Products 
WHERE ID IN (6, 8, 9, 10, 12, 14, 110, 106) 

要容易得多,没有涉及不必要CAST .....

另外:如果你真的需要一个CAST - 我会推荐给总是定义长度VARCHAR!否则,你最终可能会截断字符串....

所以使用:CAST(ID AS VARCHAR(100)),而不是仅仅CAST(ID AS VARCHAR)

+0

其实我有一个稍微不同的要求。我有一个名为ID的列,它是varchar(100)说。我需要比较它根据参数的值说这样的事情... A.ID IN(CASE当#ID = 1 THEN'1,1,3,4,5,6'WHEN #ID = 2 THEN'5,6'ELSE'0') – Ashish

+0

@Ashish:那么为什么你的问题没有反映出来? ... –

+0

我想让它变得简单易懂,这就是为什么 – Ashish

0

第二个查询是相同的:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) IN ('6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106') 

,甚至这样的:

SELECT * 
FROM dbo.Products 
WHERE CAST(ID AS VARCHAR) = '6'', ''8'', ''9'', ''10'', ''12'', ''14'', ''110'', ''106' 

因此,它不返回行,因为你没有一行ID 6', '8', '9', '10', '12', '14', '110', '106

相关问题