2011-11-07 6 views
1

私は、nvarcharカラムで整数を探していました。私は、行に ''または0が含まれている場合、0を使用して検索するとピックアップされることに気付きました。nvarcharのSQL 0 = ''&= 0?

私は0が ''と等しいという暗黙的な変換が行われていると仮定しています。なぜ2つの値を割り当てるのですか?ここで

はテストです:

--0 Test 
create table #0Test (Test nvarchar(20)) 

GO 
insert INTO #0Test (Test) 
    SELECT '' 
UNION ALL 
    SELECT 0 
UNION ALL 
    SELECT '' 

Select * 
from #0Test 

Select * 
from #0Test 
Where test = 0 

SELECT * 
from #0Test 
Where test = '0' 

SELECT * 
from #0Test 
Where test = '' 

drop table #0Test 

答えて

3

表示される動作は、製品のマニュアルに記載されている動作です。

オペレータは、異なるデータ型の2つの式を組み合わせる

、データ型の優先順位のため ルールがあることを指定:Data Type Precedenceのルールはintしたがって動作はintタイプとして発生しなければならないnvarcharよりも優先順位が高いことを指定します 低い優先順位を持つデータ型は、クエリは次のように実際にある

したがって高い 優先順位のデータ型に変換されます。

にキャストするとき3210
Select * 
from #0Test 
Where cast(test as int) = 0; 

と空の文字列N''が値0が得られます。

select cast(N'' as int) 

----------- 
0 

(1 row(s) affected) 

そこで期待される結果は空の文字列と行は述語test = 0の資格、あなたが見るものです。型を自由に混ぜ合わせるべきではないというさらなる証拠。トピックの詳細については、How Data Access Code Affects Database Performanceを参照してください。

+0

ありがとう探していた私はあるコンバージョンが続いていることを認識しましたが、私の指をそれに当てることはできませんでした。 – Armando

1

あなたは暗黙のうちにあなたのUNION文でintにフィールドを変換しています。

2つの空の文字列と整数0は、結果としてintフィールドになります。これは、nvarcharフィールドに挿入する前です。したがって、一時表のデータ型は無関係です。

UNIONにして第2の選択を変更してみてください:

SELECT '0'

そして、あなたが期待される結果を取得します。

+0

同じ結果、select文 "where test = 0"は3行すべてを取得します。私はそれが0の1行だけでなければならないと思うでしょう。 – Armando

+0

@BrettK - 'WHERE test = '0''を使う必要があります - 数字の整数' 0'も空文字列に評価されます – JNK