2011-07-22 40 views
2

WHERE 1 = '1'がtrueを返し、WHERE 222 = CONVERT(varchar, 222)がT-SQLでtrueを返すことを理解しています。比較条件と比較条件

しかし、INで作業する場合、test_expressionとサブクエリは異なるデータ型になる可能性がありますか?たとえば、test_expressionはint、サブクエリはvarcharですか?

+1

これはSQLが魔法のようにIN句に3つの別々の値として1,2,3'' ' '解釈しない理由について*さらに別の質問*へのプレリュードであれば、私は私は不幸になるだろう。 –

答えて

0

次のようになります。すべてのデータ型が "datatype precedence"の規則に基づいて最高にキャストされます。

論理的には、x in (a,b,c)は実際にはx=a or x=b or x=cです。これは、スカラー値を使用してこのように考案されたケースに関係します。私はすべての値がfloatにキャストされた場合、実際に比較(..IN..)の前(最高ここ)を知らないかそして、IN句でサブクエリについての比較(..OR..OR..

WHERE 
    CAST(1 AS int) IN ('1', CAST(1.0 AS float), 1.0 /*decimal*/) 

あたりのキャスト

すべてのデータ型は暗黙のうちに

をキャストします:列
はコメントの後、スカラルールあたり

編集としてキャストされるデータ・タイプを持っています

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

関連する問題