WHERE 1 = '1'
がtrueを返し、WHERE 222 = CONVERT(varchar, 222)
がT-SQLでtrueを返すことを理解しています。比較条件と比較条件
しかし、INで作業する場合、test_expressionとサブクエリは異なるデータ型になる可能性がありますか?たとえば、test_expressionはint、サブクエリはvarcharですか?
WHERE 1 = '1'
がtrueを返し、WHERE 222 = CONVERT(varchar, 222)
がT-SQLでtrueを返すことを理解しています。比較条件と比較条件
しかし、INで作業する場合、test_expressionとサブクエリは異なるデータ型になる可能性がありますか?たとえば、test_expressionはint、サブクエリはvarcharですか?
次のようになります。すべてのデータ型が "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)
これを見て、http://msdn.microsoft.com/en-US/library/ms177682.aspx、どのように文章を解釈する必要があります: "この列は、test_expressionと同じデータ型を持つ必要があります。 –
@Øyvind:キャストされます – gbn
これはSQLが魔法のようにIN句に3つの別々の値として1,2,3'' ' '解釈しない理由について*さらに別の質問*へのプレリュードであれば、私は私は不幸になるだろう。 –