考虑以下情况:
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
前面的查询是否比...更多,更少或同等效率
{{1}}
...
答案 0 :(得分:5)
理论上,CASE应该是因为只评估了一个表达式。几个链式ISNULL都需要处理。
但是,您需要有一个大的(10000行)数据集才能发现任何差异:大多数处理都会进入实际的表访问,JOIN等。
你试过吗?您可以使用SQL事件探查器查看每个查询的CPU等。
答案 1 :(得分:1)
我相信ISNULL效率更高。 CASE语句总是先评估,我相信会限制查询优化器可用的选项。
执行计划说了什么?这是你的实际问题吗?
答案 2 :(得分:1)
COALESCE
是ANSI
函数,而ISNULL
是SQL Server
专有函数。
它们在类型处理和其他一些方面有所不同,而COALESCE
可能会接受两个以上的参数。
对于你的任务(两个参数,VARCHAR
},它们是等价的。