0

DateDiff 関数を使用して日付間の日数を見つける単純なクエリを実行しています。ただし、特定のインスタンスに関しては、(null ではなく) 空白のフィールドにデータを入力したいと考えています。

このようなものは私が現在持っているもので、正常に動作しているようです (ただし、null が入力されます)。

 [Test (Years)] = CASE WHEN TYPE IN ('A','B') 
 THEN NULL ELSE IsNull(CONVERT(decimal(28,12),
 (DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END

このようなことを試してみると...すべてのTYPE AとBを変換して空白を入力しようとすると、次のエラーメッセージが表示されます。Error converting data type varchar to numeric.

 [Test (Years)] = CASE WHEN TYPE IN ('A','B') 
 THEN '' ELSE IsNull(CONVERT(decimal(28,12),
 (DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END

私が見逃している簡単なことはありますか?小数に変換せずに計算してみましたが、うまくいかないようです。何か案は?ありがとう

4

1 に答える 1

1

CASEは正確に 1 つの値を返す式であり、すべてのブランチが互換性のある型を生成する必要があります。文字列 (空の文字列であっても) は 10 進数と互換性がないため、次のようにする必要があります。

CASE WHEN ... THEN '' ELSE 
  CONVERT(VARCHAR(32), COALESCE(CONVERT(DECIMAL(23,12), ... ,0)) END

このハックは、エンド ユーザーにデータを提示する場合にのみ機能することに注意してください。このデータを列に格納しようとしたり、他の計算で使用しようとすると、空白の文字列によってつまずきます。数値を空白の文字列にすることはできません:

DECLARE @i INT = '';
SELECT @i;

結果:

0

したがって、「空の」数値を 0 と解釈したくない場合は、恐れるのをやめてNULLください。プレゼンテーション時にこれを処理する場合は、プレゼンテーション レイヤーに の代わりに空白の文字列を提示させますNULL

于 2013-09-26T16:24:52.150 に答える