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 :(得分:2)
没有什么根本可以阻止CASE
语句使用LEFT (OUTER) JOIN
,但要记住关于OUTER连接的重要事项是外表中可能有NULL值。
您撰写的CASE
语句不会对此进行说明,例如: (假设[Descr]可能为NULL),在您的语句中:
如果[Descr]为NULL,len([Descr])= 0然后[Code] else [Descr]结束为[Descr]
len([Descr])
将计算为NULL而不是零,因此会转到ELSE
的{{1}}子句,无论如何都会返回NULL字段。< / p>
使用CASE
编写该文件的正确方法是:
CASE
但是使用CASE WHEN len(IsNull([Descr], '')) = 0 THEN [Code] ELSE [Descr] END AS [Descr]
函数有一种更简单的方法:
Coalesce
按顺序计算参数并返回当前的值 第一个表达式,最初不会计算为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,否则返回第一个。