2011-07-22 55 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