我有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 :(得分: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 value中SELECT
谓词中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