私は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
はなく、それらをチェックしています。string
int
しかし、それでも同じエラーが発生します。
何が欠けていますか?
注意
私はこれを行うことができる/行う必要があることを知っています:
SELECT 'dummy'
FROM @tbl
WHERE
(isCalcByA = 1 AND a IS NOT NULL)
OR
(isCalcByA <> 1 AND b IS NOT NULL)
(これは正常に動作します)
CASE
しかし、最初の状況でなぜ機能しないのか尋ねています