私はSQLサーバーにこの単純なテーブルを持っています:
DECLARE @tbl table( a int ,  b NVARCHAR(100), isCalcByA bit)
INSERT INTO @tbl
SELECT 1,'c',1
UNION ALL
SELECT 2,'d',0
Ok。
これを実行すると:
SELECT CASE 
            WHEN  isCalcByA = 1 THEN  a
            ELSE  b
       END  FROM @tbl
エラーが発生します:
メッセージ 245、レベル 16、状態 1、行 9
nvarchar 値 'd' をデータ型 int に変換するときに変換に失敗しました。
なぜそれが起こっているのか理解できます:
蓄積中(表示中)のデータは  、intとstringを同じ列に並べることができないためです。
Ok
しかし、これはどうですか:
SELECT 'dummy'
FROM   @tbl
WHERE  CASE 
            WHEN isCalcByA = 1 THEN a
            ELSE b
       END IS NOT NULL
ここ -
- いつも表示していますstring
- 異なるタイプの異なる表示結果を蓄積しません。
- または値でnot nullはなく、それらをチェックしています。stringint
しかし、それでも同じエラーが発生します。
何が欠けていますか?
注意
私はこれを行うことができる/行う必要があることを知っています:
SELECT 'dummy'
FROM   @tbl
WHERE 
(isCalcByA = 1 AND a IS NOT NULL)
OR
(isCalcByA <> 1 AND b IS NOT NULL)
(これは正常に動作します)
CASEしかし、最初の状況でなぜ機能しないのか尋ねています