2011-08-30 3 views
12

私はここで私はビットフィールドである必要が計算カラム、式の例を得た:計算列のデータ型をNULLを許可しないビットフィールドに強制するにはどうすればよいですか?

case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end 

この式を用いて計算カラムセットのデータ型がintあります。

正しいデータ型を強制する最良の方法は何ですか?ケース全体にCONVERT Withステートメント

、データ型がbitですが、それAllow Nulls

CONVERT([bit], 
     case when (([some_field] < [Some_Other_field]) 
     then 0 
     else 1 
     end, 
     0) 

結果式にCONVERTの文と同じこと、データ型がbitですが、それAllow Nulls

case when (([some_field] < [Some_Other_field]) 
then CONVERT([bit], (0), 0) 
else CONVERT([bit], (1), 0) 
end 

これを行うにはスマートな方法がありますか?

答えて

21

計算された列定義をISNULLにラップし、2番目の引数として好きなものを指定します(ビットまたは変換可能であれば)。

COALESCEではなく、ISNULLを使用しなければならない数少ない場所の1つです。 SQL Serverには、NULL以外の第2引数を持つISNULLがnullを許可しない結果を表すことを認識するための特殊なケースロジックがあります。

例えば:これはまた、例えばて使用することができる

ISNULL(CONVERT(bit,case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end),0) 

ビュー定義。

+0

あなたの例と次の代替構文間のパフォーマンスの違いがある場合や、誰もがアイデアを持ってください: '場合([some_field] <[Some_Other_field]) その後、ISNULL(CONVERT(ビット、0) 、0) 他ISNULL(CONVERT(ビット、1)、1) end'? – tomosius

+0

@tomosius - 大規模なスキーム(データアクセスやネットワークオーバーヘッドに関連するI/Oコストなど)では、測定可能な*差は期待できません。私はまたあなたの変種が、避けようとしていた問題を再導入するかもしれないと思っています。 –

関連する問題