为什么其中一个查询没有返回任何行?

时间:2012-10-11 10:28:47

标签: sql sql-server-2008

我有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'))

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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

第二个查询将值视为单个字符串

IN子句

中使用时,必须使用''(单引号)分隔字符值

答案 2 :(得分:0)

  

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

因为第二个查询returns only one string valueSELECT谓词中IN语句返回的值是:

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)

答案 3 :(得分: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

的行