Case 语句有助于从多个连接中替换 null

Case statement help for replacing null from multiple joins

所以我有以下情况,如果 jl 名称没有 n/a,我希望它来自同一列。如果有 n/a 我想查看这个子查询并找到最近的 jl 名称。但是如果 crecent.jl 名称为空,我想从另一个左连接子查询中提取它,该子查询从 temprosRecent.[JL 名称] 中提取最后一条可用记录。当我测试它时,我在 temprosRecent.[JL name] 中找到了记录 单独但在我下面的主要查询案例语句中,我仍然得到 null 作为记录。是因为我的案件的顺序吗?我尝试多次切换订单,但没有成功?

> ,CASE 
>           
>            WHEN EF.[JL name]!='N/A' then EF.[JL name]
>            
>            WHEN EF.[JL name]='N/A' THEN cRecent.[Jl_NAME]
>            
>            when cRecent.[Jl_NAME] IS null then temprosRecent.[JL name]
>           end as [NCW-Jl combo]

我正在使用 sql 2012.

您应该在 when 子句中使用额外的条件并像这样重新排序:

 ,CASE 
    WHEN EF.[JL name]!='N/A' then EF.[JL name]
    when cRecent.[Jl_NAME] IS null and EF.[JL name]='N/A' then temprosRecent.[JL name]
    WHEN EF.[JL name]='N/A' THEN cRecent.[Jl_NAME]
  end as [NCW-Jl combo]

以下代码处理 'N/A' 情况,然后在 EF.[JL name] is NULL 时默认 returning temprosRecent.[JL name],这是唯一剩下的可能性。请注意,如果 temprosRecent.[JL name] 为空,它仍可能 return 为空。

使用 coalesce 处理 cRecent.[Jl_NAME] 为 null 和 returning temprosRecent.[JL name] 的可能性。

CASE
  WHEN EF.[JL name] != 'N/A' then EF.[JL name]
  WHEN EF.[JL name] = 'N/A' THEN Coalesce( cRecent.[Jl_NAME], temprosRecent.[JL name] )
  ELSE temprosRecent.[JL name]
  end as [NCW-Jl combo]

是的,顺序很重要。结果将来自第一个匹配条件。请注意,短路是 not 保证的。如果表达式有副作用或可能产生错误,例如除以零,即使案例列在匹配案例之后,也可能发生这种情况。