2011-07-22 56 views
2

据我所知,WHERE 1 = '1'返回true,并且WHERE 222 = CONVERT(varchar, 222)将在T-SQL中返回true。In与对比搜索条件

但是,使用IN时,test_expression和子查询可以是不同的数据类型?例如,test_expression可以是一个int,而子查询varchar?

+1

如果这是一个前奏*另一个问题*为什么SQL不会奇迹般地IN子句中解释''1,2,3''为3个独立的价值观,我将会不高兴。 –

回答

0

它们可以是:根据“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) 
+0

看看这个http://msdn.microsoft.com/en-US/library/ms177682.aspx,应该如何解释这个句子:“这个列必须和test_expression具有相同的数据类型。” –

+0

@Øyvind:将被施放 – gbn