如何在使用左连接后使用case语句?

时间:2015-09-18 00:16:11

标签: sql-server case hierarchy

select t1.Name, t1.[Code], t2.Name as ParentName
      ,case when len(t2.[ParentCode]) = '' then t1.[Code] else t2.[ParentCode] end as t1.[ParentCode]
      ,case when len([Descr])=0 then [Code] else [Descr] end as [Descr]
      ,t1.[Cumulative]
      ,t1.[Expense]
      ,t1.[Accts]
      ,t1.[Admin]
      ,t1.[Assessment]
      ,t1.[Balance]
      ,t1.[Fiber]
      ,t1.[GL]
      ,t1.[LV]
      ,t1.[Slush]
from [KR].[pl].[Accounts] as t1
left join [KR].[pl].[Accounts] t2 on t1.ParentCode = t2.ParentCode

我正在尝试使用case语句填写空白列,在我使用左连接之前,它工作正常,但在我使用左连接后它不再工作了。无论如何使用左连接来处理这些case语句?

1 个答案:

答案 0 :(得分:2)

没有什么根本可以阻止CASE语句使用LEFT (OUTER) JOIN,但要记住关于OUTER连接的重要事项是外表中可能有NULL值。

您撰写的CASE语句不会对此进行说明,例如: (假设[Descr]可能为NULL),在您的语句中:

  

len([Descr])= 0然后[Code] else [Descr]结束为[Descr]

如果[Descr]为NULL,

len([Descr])将计算为NULL而不是零,因此会转到ELSE的{​​{1}}子句,无论如何都会返回NULL字段。< / p>

使用CASE编写该文件的正确方法是:

CASE

但是使用CASE WHEN len(IsNull([Descr], '')) = 0 THEN [Code] ELSE [Descr] END AS [Descr] 函数有一种更简单的方法:

Coalesce

MSDN on Coalesce says:

  

按顺序计算参数并返回当前的值   第一个表达式,最初不会计算为NULL。

所以你的查询变为:

Coalesce([Descr], [Code]) AS [Descr]

编辑:要添加一件事 - 如果[ParentCode]或[Descr]的值可能是零长度字符串(''),并且您想要返回其中的其他字段也是如此,然后像这样编写Coalesce语句:

select t1.Name, t1.[Code], t2.Name as ParentName
      ,Coalesce(t2.[ParentCode], t1.[Code]) AS [ParentCode]
      ,Coalesce([Descr], [Code]) AS [Descr]         
      ,t1.[Cumulative]
      ,t1.[Expense]
      ,t1.[Accts]
      ,t1.[Admin]
      ,t1.[Assessment]
      ,t1.[Balance]
      ,t1.[Fiber]
      ,t1.[GL]
      ,t1.[LV]
      ,t1.[Slush]
from [KR].[pl].[Accounts] as t1
left join [KR].[pl].[Accounts] t2 on t1.ParentCode = t2.ParentCode

NullIf函数与Coalesce相反,如果两个表达式相等则返回NULL,否则返回第一个。