3 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
Microsoft Connect上報(bào)告的此問(wèn)題揭示了COALESCE和之間的一些區(qū)別ISNULL:
我們處理的早期部分重寫(xiě)COALESCE( expression1, expression2 )為CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END。在[此示例]中:
COALESCE ( ( SELECT Nullable
FROM Demo
WHERE SomeCol = 1 ), 1 )
我們生成:
SELECT CASE
WHEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) IS NOT NULL
THEN (SELECT Nullable FROM Demo WHERE SomeCol = 1)
ELSE 1
END
查詢(xún)處理的后期階段不了解這兩個(gè)子查詢(xún)?cè)臼窍嗤谋磉_(dá)式,因此它們執(zhí)行了兩次子查詢(xún)...
盡管我不愿提出建議,但一種解決方法是將更COALESCE改為ISNULL,因?yàn)楹笳卟粫?huì)復(fù)制子查詢(xún)。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為不是,但是COALESCE是SQL '92標(biāo)準(zhǔn)的,并得到更多不同數(shù)據(jù)庫(kù)的支持。如果您追求可移植性,請(qǐng)不要使用ISNULL。

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
值得一提的是,兩者之間的類(lèi)型處理也可以有所作為(請(qǐng)參閱此相關(guān)答案項(xiàng)(2))。
假設(shè)查詢(xún)嘗試使用快捷方式編寫(xiě)空比較:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
不同于
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
因?yàn)樵诘谝环N情況下,IsNull()強(qiáng)制類(lèi)型為一點(diǎn)(因此將-1轉(zhuǎn)換為true),而在第二種情況下,兩者都會(huì)提升為int值。
with input as
(
select convert(bit, 1) as BitOn,
convert(bit, 0) as BitOff,
convert(bit, null) as BitNull
)
select BitOn,
BitOff,
BitNull,
IsNull(BitOn, -1) IsNullBitOn, -- true
IsNull(BitOff, -1) IsNullBitOff, -- false
IsNull(BitNull, -1) IsNullBitNull, -- true, converts the -1 to bit
coalesce(BitOn, -1) CoalesceBitOn, -- 1
coalesce(BitOff, -1) CoalesceBitOff, -- 0
coalesce(BitNull, -1) CoalesceBitNull -- -1
from input;
問(wèn)題本身也有類(lèi)似的評(píng)論/鏈接(@Martin Smith)。
- 3 回答
- 0 關(guān)注
- 769 瀏覽
添加回答
舉報(bào)