与比较搜索条件

时间:2011-07-22 07:40:30

标签: tsql

我理解WHERE 1 = '1'返回true,而WHERE 222 = CONVERT(varchar, 222)将在T-SQL中返回true。

但是,在使用IN时,test_expression和子查询是否可以具有不同的数据类型?例如,test_expression可以是int,子查询是varchar吗?

1 个答案:

答案 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)