我在SQL Server中這個簡單的表:CASE在sql服務器 - 實現澄清?
DECLARE @tbl table(a int , b NVARCHAR(100), isCalcByA bit)
INSERT INTO @tbl
SELECT 1,'c',1
UNION ALL
SELECT 2,'d',0
確定。
如果我運行此:
SELECT CASE
WHEN isCalcByA = 1 THEN a
ELSE b
END FROM @tbl
它會產生一個錯誤:
消息245,級別16,狀態1,9號線
轉換轉換爲nvarchar值 'd' 時失敗到數據類型int。
我可以理解爲什麼它正在發生的事情:
因爲它被積累的數據(顯示)在同一列不能將兩者int
和string
。
好
但對於這一點:
SELECT 'dummy'
FROM @tbl
WHERE CASE
WHEN isCalcByA = 1 THEN a
ELSE b
END IS NOT NULL
這裏 -
- 我總是顯示
string
- 我不積累不同顯示不同類型的結果。
- 我正在檢查他們對
not null
而不是string
或int
值。
但是我仍然得到相同的錯誤。
我錯過了什麼?
NB
我知道我能/應該這樣做:
SELECT 'dummy'
FROM @tbl
WHERE
(isCalcByA = 1 AND a IS NOT NULL)
OR
(isCalcByA <> 1 AND b IS NOT NULL)
(工作正常)
但我問爲什麼沒有在第一CASE
工作情況
'CASE WHEN isCalcByA = 1 then ELSE b END IS NOT NULL'永遠不會是false - case語句不能返回null。 – Bridge
@Bridge「永不假」不是錯誤的原因。這就像'where 1 = 2'(這當然不是錯誤) –
我同意 - 只是說where子句是毫無意義的,因爲它永遠是相同的值,是真的。 – Bridge