2015-09-18 24 views
2
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语句?

+0

你在使用左连接之前使用了什么?什么不工作? – DarkKnight

回答

2

没有什么根本的原理可以阻止语句与LEFT (OUTER) JOIN一起工作,但要记住关于OUTER连接的重要事项是外表中可能有NULL值。

您的CASE如书面陈述并未说明这一点,例如, (假设在原有表]可能是NULL),在你的声明:

情况下,当LEN([DESCR)= 0,则[编号]别的[DESCR]年底为[DESCR]

如果[Descr]为NULL,则len([Descr])将评估为NULL,而不是零,因此落入CASEELSE子句,无论如何返回NULL字段。

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

CASE WHEN len(IsNull([Descr], '')) = 0 THEN [Code] ELSE [Descr] END AS [Descr] 

但有更简单的方法,使用Coalesce功能:

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

MSDN on Coalesce says:

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

所以,你的查询变为:

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 

编辑:有一件事要添加 - 如果您的[ParentCode]或值在原有表]可能是一个零长度字符串( ''),并且要在这种情况下返回的其他领域也一样,然后写了合并报表,像这样:

Coalesce(NullIf(t2.[ParentCode], ''), t1.[Code]) AS [ParentCode] 
Coalesce(NullIf([Descr], ''), [Code]) AS [Descr] 

NullIf功能无法一种相反的凝聚,返回如果TW NULL o表达式是平等的,否则是第一个。