私の仮定では、その値が数値 (isnumeric 範囲内) の場合は true を返しますが、 が返さFALSEれる場合は. どうやら私の推測は外れていたようです...ISNULL'blah'
私は次の方法でそれを使用しています
case when ISNULL(ISNUMERIC(c.npinumber), 'blah') = 1
then c.NPiNUmber
else 'not valid: ' + c.NpiNumber
end as npi
私の仮定では、その値が数値 (isnumeric 範囲内) の場合は true を返しますが、 が返さFALSEれる場合は. どうやら私の推測は外れていたようです...ISNULL'blah'
私は次の方法でそれを使用しています
case when ISNULL(ISNUMERIC(c.npinumber), 'blah') = 1
then c.NPiNUmber
else 'not valid: ' + c.NpiNumber
end as npi
Dhruveshの答えに基づいて、
case
when ISNUMERIC(c.npinumber) = 1 then c.NPiNUmber
else 'not valid: ' + c.NpiNumber
end as npi
NpiNumber が NULL の場合はいつでも NULL を生成します。その理由は、NULL + 任意の文字列が引き続き NULL を返すためです。解決策は、単純に COALESCE 関数を使用することです
case
when ISNUMERIC(c.npinumber) = 1 then c.NPiNUmber
else 'not valid: ' + COALESCE(c.NpiNumber, 'NULL VALUE')
end as npi
ISNULL は必要ありません。ISNUMERIC は、数値の場合は 1 を返し、NULL または非数値の場合は 0 を返します。
case
when ISNUMERIC(c.NpiNumber) = 1 then c.NPiNUmber
else 'not valid: ' + c.NpiNumber
end as npi
また、ユーリックが言及したように、すべて小文字の列名を確認することもできます。
select ISNUMERIC(ISNULL(NULL, 'blah')),
ISNUMERIC(ISNULL(1234, 'blah')),
ISNUMERIC(ISNULL('ab', 'blah'))
0、1、0 を返すので、ロジックは正しいです。
SQL が動作しないときは、クエリを単純化するのが好きです。最初に case ステートメントを使用せずにクエリを実行してみてください。結果が正しい場合は、ロジックを追加します。
データベースの照合順序は何ですか? 列名を適切に大文字と小文字を区別することは常に良い考えです (あちらのすべて小文字の列名を見ています...)。