3

私の仮定では、その値が数値 (isnumeric 範囲内) の場合は true を返しますが、 が返さFALSEれる場合は. どうやら私の推測は外れていたようです...ISNULL'blah'

私は次の方法でそれを使用しています

case when ISNULL(ISNUMERIC(c.npinumber), 'blah') = 1
       then c.NPiNUmber
     else 'not valid: ' + c.NpiNumber
     end as npi 
4

3 に答える 3

2

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
于 2012-08-21T18:44:05.527 に答える
2

ISNULL は必要ありません。ISNUMERIC は、数値の場合は 1 を返し、NULL または非数値の場合は 0 を返します。

  case
       when ISNUMERIC(c.NpiNumber) = 1 then c.NPiNUmber
       else 'not valid: ' + c.NpiNumber
  end as npi 

また、ユーリックが言及したように、すべて小文字の列名を確認することもできます。

于 2012-08-21T05:56:46.180 に答える
1
select  ISNUMERIC(ISNULL(NULL, 'blah')),
        ISNUMERIC(ISNULL(1234, 'blah')),
        ISNUMERIC(ISNULL('ab', 'blah')) 

0、1、0 を返すので、ロジックは正しいです。

SQL が動作しないときは、クエリを単純化するのが好きです。最初に case ステートメントを使用せずにクエリを実行してみてください。結果が正しい場合は、ロジックを追加します。

データベースの照合順序は何ですか? 列名を適切に大文字と小文字を区別することは常に良い考えです (あちらのすべて小文字の列名を見ています...)。

于 2012-08-21T04:07:31.057 に答える