我理解WHERE 1 = '1'
返回true,而WHERE 222 = CONVERT(varchar, 222)
将在T-SQL中返回true。
但是,在使用IN时,test_expression和子查询是否可以具有不同的数据类型?例如,test_expression可以是int,子查询是varchar吗?
答案 0 :(得分:0)
它们可以是:所有数据类型将根据“datatype precedence”规则强制转换为最高数据类型。
逻辑上,x in (a,b,c)
当然是x=a or x=b or x=c
。这与使用标量值的这种人为案例相关。我真的不知道如果在比较之前所有值都是CAST浮动(这里是最高的)(..IN..
)或每次比较投出(..OR..OR..
)
WHERE
CAST(1 AS int) IN ('1', CAST(1.0 AS float), 1.0 /*decimal*/)
对于IN子句中的子查询,列的数据类型将根据标量规则进行CAST
评论后编辑:
所有数据类型都将隐式CAST
SELECT TOP 1 *
FROM sys.columns
WHERE
1 IN (SELECT CAST('1' AS CHAR(1)) FROM sys.columns)
或
DECLARE @intvar int = 1, @charvar char(1) = '1';
SELECT TOP 1 *
FROM sys.columns
WHERE
@intvar IN (SELECT @charvar FROM sys.columns)