-4

我有两个这样的查询:

查询 #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

4 回答 4

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)

于 2012-10-11T10:32:35.300 回答
0

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

在IN 子句中使用时,您必须使用 ''(单引号)来分隔字符值

于 2012-10-11T10:31:41.320 回答
0

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

因为第二个查询SELECTIN谓词中的语句返回的值返回一个字符串值,即:

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)
于 2012-10-11T10:31:52.113 回答
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

于 2012-10-11T10:32:59.107 回答