【问题标题】:Case in update statement更新声明中的案例
【发布时间】:2026-01-28 15:55:02
【问题描述】:

我正在尝试将具有嵌套 IF 语句的 talend 代码翻译成 SQL

我以为我已经正确翻译了它,但是由于连接条件失败,没有记录得到更新。我添加了一个*案例语句来检查记录是否存在,但想在这里向专家再次检查我的翻译是否正确。

来自 Talend Mapper 的逻辑:

   IF row32.DISPLAY_NAME_REPORTED IS NULL THEN
     IF row31.REPORTED_DISPLAY_NAME IS NULL THEN
       IF row87.SPEC_TYPE1 IS NULL THEN
         IF row87.SPEC_TYPE2 IS null THEN
           row34.Series
         ELSE
           row34.Series + row34.Type2
         END
       ELSE
         row34.Series + row34.Type2
       END
     ELSE
       row31.REPORTED_DISPLAY_NAME
     END
   ELSE
     row32.DISPLAY_NAME_REPORTED  
   END

SQL中对应的case语句:

update a
        set a.seriesbt = case when exists (select 1 from  row32 x where 
           x.delivery_fk = a.delivery_fk) then
    case when b.delivery_fk is not null and 
                  b.DISPLAY_NAME_REPORTED is null then 
          case when c.reported_display_name is null then 
            case when d.SPEC_TYPE1 is null then
            case when d.SPEC_TYPE2 is null then
                    a.series 
                  else
                a.series+a.SPEC_TYPE2 end
            else a.series + a.SPEC_TYPE1 end 
             else c.reported_display_name end
        else b.DISPLAY_NAME_REPORTED end
    else a.series end
from tmpSales a 
left join row32 b on b.delivery_fk = a.delivery_fk 
left join row31 c  on c.DELIVERY_FK = a.delivery_fk 
left join row87 d on d.DELIVERY_FK = a.delivery_fk

问题是:我是否正确地将 talend 映射器逻辑转换为 SQL?如果没有,你能告诉我什么是错的。
我应该为每个表包括“何时存在”吗?
我认为左连接应该隐式处理它。

【问题讨论】:

  • 我注意到“b.delivery_fk is not null”之类的语句不在您的逻辑中。您是否发布了所有逻辑?

标签: sql sql-server


【解决方案1】:

您似乎添加了原始代码中没有的附加条件。以相反的方式编码可以使事情变得更简单,并避免嵌套 CASE 表达式。

我更改了您的表别名,以便更容易理解列的来源,而无需返回 FROM 子句。

UPDATE s
SET a.seriesbt = CASE WHEN r32.DISPLAY_NAME_REPORTED IS NOT NULL THEN r32.DISPLAY_NAME_REPORTED
                      WHEN r31.reported_display_name IS NOT NULL THEN r31.reported_display_name
                      WHEN r87.SPEC_TYPE1 IS NOT NULL THEN s.series /*row34.Series*/ + s.SPEC_TYPE1
                      WHEN r87.SPEC_TYPE2 IS NULL THEN s.series  --row34.Series
                      ELSE s.series /*row34.Series*/ + s.SPEC_TYPE2 
                      END
FROM tmpSales s 
LEFT JOIN row32 r32 ON r32.delivery_fk = s.delivery_fk 
LEFT JOIN row31 r31 ON r31.DELIVERY_FK = s.delivery_fk 
LEFT JOIN row87 r87 ON r87.DELIVERY_FK = s.delivery_fk;

我刚刚意识到它可以进一步简化。

UPDATE s
SET a.seriesbt = COALESCE( r32.DISPLAY_NAME_REPORTED, 
                        r31.reported_display_name, 
                        s.series /*row34.Series*/ + s.SPEC_TYPE1, 
                        s.series /*row34.Series*/ + s.SPEC_TYPE2,
                        s.series  --row34.Series
                        )
FROM tmpSales s 
LEFT JOIN row32 r32 ON r32.delivery_fk = s.delivery_fk 
LEFT JOIN row31 r31 ON r31.DELIVERY_FK = s.delivery_fk 
LEFT JOIN row87 r87 ON r87.DELIVERY_FK = s.delivery_fk;

【讨论】: