考慮以下情形:效率使用CASE WHEN ... IS NOT NULL VS ISNULL的/ COALESCE
- 有三種類型的實體,說
Foo
,Bar
和Baz
。 - 每個
Foo
必須與Bar
或Baz
關聯,但不能同時關聯。
的情況下通過以下方式已經實現:
- 有三個表:
Foo
,Bar
和Baz
。 Foo
有兩個外鍵字段:Bar_ID
和Baz_ID
。- 這些外鍵字段中的一個必須是
NULL
。現在
我想建立一個查詢顯示的Foo
是清單,包括Bar
或Baz
每個Foo
的描述相關聯。實際上,Bar
的描述是Bar
表中相應行的字段的相當複雜的公式。這同樣適用於Baz
。
我當前的查詢如下所示:
SELECT Foo.*,
CASE
WHEN Foo.Bar_ID IS NOT NULL THEN
-- a formula, say...
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber
WHEN Foo.Baz_ID IS NOT NULL THEN
-- another formula, say...
ISNULL(Baz.Color + ' ', '') + Baz.Type
END AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
是上次查詢更多,更少或比同樣有效......
SELECT Foo.*,
ISNULL(-- or COALESCE
ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber,
ISNULL(Baz.Color + ' ', '') + Baz.Type
) AS 'Ba?Description'
FROM Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID
...?
我幾乎沒有要處理的數據,但我確實知道這將用於數據量與效率相關的環境中。 – pyon
這是一個很好的觀點。我沒有考慮嵌套在ISNULL塊中的表達式的數量。 –
+1 - 此外'NULL'處理通常非常快,所以肯定需要大量數據集才能顯示。 – JNK