sql-server - 使用左连接后如何使用 case 语句?

标签 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 语句与 LEFT (OUTER) JOIN 一起工作没有什么基本的东西,但是关于 OUTER 连接要记住的重要一点是可能有 NULL 值在外表。

您编写的 CASE 语句没有说明这一点,例如(假设 [Descr] 可能为 NULL),在您的声明中:

case when len([Descr])=0 then [Code] else [Descr] end as [Descr]

如果 [Descr] 为 NULL,

len([Descr]) 将评估为 NULL,而不是零,因此落入 ELSE 子句>CASE,无论如何返回 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:

Evaluates the arguments in order and returns the current value of the first expression that initially does not evaluate to 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] 或 [Descr] 的值可能是零长度字符串 (''),并且您想返回其中的另一个字段case 也是如此,然后像这样编写 Coalesce 语句:

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

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

关于sql-server - 使用左连接后如何使用 case 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641944/

相关文章:

mysql - 从两个表创建 Mysql View 不起作用

c# - 类层次结构的适当设计

sql - 非常大的表中的列的不同值

sql - 设置快照隔离不反射(reflect)

sql - “Case 语句”可以安全地用于 JDBC 的常规/准备语句中吗?

SQL Server 内联 CASE WHEN ISNULL 和多重检查

c++调用图,但作为文本

java - 如何扁平化整个包层次结构?

c# - 在Sql中执行插入命令并返回插入的Id

SQL将表连接到自身以获取上一年的数据