SELECT语句中ISNULL的性能

时间:2014-07-14 05:58:32

标签: sql-server tsql

我有一个包含以下列的表,

ID(int),
RegardingContactID(int),
RegardingAccountId(int),
RegardingIncidentID(int),
RegardingType(varchar)

RegardingType可以是"联系","帐号","事件"

基本上我想抽象所有RegardingXXXID列,如下所示:

 SELECT 
     ID,
     ISNULL(RegardingContactID, ISNULL(RegardingAccountId, RegardingIncidentID)) AS RegardingID,
     RegardingType

这似乎按预期工作,但ISNULL似乎不具备大型数据集的效果。

是否有更优雅/高效的方法来实现这一目标?

3 个答案:

答案 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列并在应用程序中选择正确的列来处理查询结果。