ANSIで定義されている動作は、null
nullity()の明示的なテストの保存を含むすべての操作でis [not] null
nullが生成されることです。残念ながら、SQLServerのデフォルトの動作は非標準です。それで...
スタンドアロンクエリを実行する前に、次の2つの設定がストアドプロシージャに対してオンになっているか、接続でオンになっていることを確認する必要があります。
set ansi_nulls on
set concat_nulls on
これらをストアドプロシージャの本体でオンに設定した場合、設定はそのストアドプロシージャ内でのみ適用されます。(ステートメントを実行することによってset
)接続に対してそれらをオンに設定すると、それらはその接続で実行されるすべてのクエリに対して1つになります(ストアドプロシージャが独自の実行コンテキストを持っていることを除く)。
null
欠測データが常にnil文字列()ではなく、常に保証できないのは残念です''
。これにより、ロジックが単純になります。
とにかく、適切な `null動作を有効にすると、次のようになります。
-- if missing data is always NULL, do this
select zip9 = t1.zip5 + coalesce( '-'+t1.zip4 , '' )
from someTable t1
また
-- if missing data might be nil ('') or NULL, do this
select zip9 = t1.zip5
+ coalesce(
'-'
+ case coalesce(t1.zip4,'') when '' then null else t1.zip4 end ,
''
)
from someTable t1
トリックを行う必要があります。
それ以外の場合、正しい動作を有効にしたくない場合は、次のようにすることができます。これは、標準のNULL動作でも機能します。複数のテストが含まれるので、私はそれが好きではありません。しかし、彼らが言うように、 TMTOWTDI。
select zip9 = t1.zip5
+ case
when t1.zip4 = '' then ''
when t1.zip4 is null then ''
else '-' + t1.zip4
end
from someTable t1