2015-09-18 41 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表達式是平等的,否則是第一個。