据我所知,WHERE 1 = '1'
返回true,并且WHERE 222 = CONVERT(varchar, 222)
将在T-SQL中返回true。In与对比搜索条件
但是,使用IN时,test_expression和子查询可以是不同的数据类型?例如,test_expression可以是一个int,而子查询varchar?
据我所知,WHERE 1 = '1'
返回true,并且WHERE 222 = CONVERT(varchar, 222)
将在T-SQL中返回true。In与对比搜索条件
但是,使用IN时,test_expression和子查询可以是不同的数据类型?例如,test_expression可以是一个int,而子查询varchar?
它们可以是:根据“datatype precedence”规则将所有数据类型转换为最高。
逻辑上,x in (a,b,c)
当然是x=a or x=b or x=c
。这与使用标量值的这种人为的情况相关。我真的不知道如果所有值都强制转换为浮动(最高位置)的比较(..IN..
)之前或每比较(..OR..OR..
)
WHERE
CAST(1 AS int) IN ('1', CAST(1.0 AS float), 1.0 /*decimal*/)
投给一个子查询IN子句中,那么列有将在每一个标量规则
编辑被转换为数据类型,注释后:
所有的数据类型将被隐式转换
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)
看看这个http://msdn.microsoft.com/en-US/library/ms177682.aspx,应该如何解释这个句子:“这个列必须和test_expression具有相同的数据类型。” –
@Øyvind:将被施放 – gbn
如果这是一个前奏*另一个问题*为什么SQL不会奇迹般地IN子句中解释''1,2,3''为3个独立的价值观,我将会不高兴。 –