我有一个包含以下列的表,
ID(int),
RegardingContactID(int),
RegardingAccountId(int),
RegardingIncidentID(int),
RegardingType(varchar)
RegardingType
可以是"联系","帐号","事件"
基本上我想抽象所有RegardingXXXID
列,如下所示:
SELECT
ID,
ISNULL(RegardingContactID, ISNULL(RegardingAccountId, RegardingIncidentID)) AS RegardingID,
RegardingType
这似乎按预期工作,但ISNULL
似乎不具备大型数据集的效果。
是否有更优雅/高效的方法来实现这一目标?
答案 0 :(得分:1)
我建议您使用COALESCE
代替ISNULL
SELECT ID,
COALESCE(RegardingContactID, RegardingAccountId, RegardingIncidentID) AS RegardingID,
答案 1 :(得分:1)
如果我们再挖掘一下,COALESCE
基本上被SQL Server引擎转换为CASE
语句,就像这样:
select case
when RegardingContactID is not null then RegardingContactID
when RegardingAccountId is not null then RegardingAccountId
when RegardingIncidentID is not null then RegardingIncidentID
end AS RegardingID
但你可能会以此结束:
select case
when RegardingType = 'Contact' then RegardingContactID
when RegardingType = 'Account' then RegardingAccountId
when RegardingType = 'Incident' then RegardingIncidentId
end as RegardingID
,即imho,与您的原始目标更相关。
PS。 ISNULL的表现还不错。它仅仅是评估链(3次)可能会导致性能下降。
答案 2 :(得分:0)
正如对方所说,COALESCE更优雅,可能表现更好。
但是对于我建议对这两种方法进行基准测试的性能,它是如何实现它的唯一方法。另一种方法可能是选择所有3列并在应用程序中选择正确的列来处理查询结果。