繁体   English   中英

基于其他列的条件的SQL UPDATE

[英]SQL UPDATE based on conditions of other columns

我正在尝试执行以下操作。

UPDATE account
SET new_finalleadsource =

CASE WHEN 
new_jtrack_source IS NOT NULL AND new_jtracksource <> '' 
THEN new_jtrack_source

CASE WHEN 
new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> '' 
THEN new_jrackofflinesource

CASE WHEN
new_leadsource IS NOT NULL AND new_leadsource <> ''
THEN new_leadsource

ELSE NULL
END

不知道是否可以通过这种方式使用大小写,我基本上是在尝试根据其他第三个具有数据的列中的其他三个列中的一个来更新值。

谢谢

您不需要多个CASE语句,而是使用带有多个WHEN表达式的单个Case语句

试试这个

UPDATE account 
SET    new_finalleadsource = CASE 
                               WHEN new_jtrack_source IS NOT NULL 
                                    AND new_jtracksource <> '' THEN new_jtrack_source 
                               WHEN new_jtrackofflinesource IS NOT NULL 
                                    AND new_jtrackofflinesource <> '' THEN new_jrackofflinesource 
                               WHEN new_leadsource IS NOT NULL 
                                    AND new_leadsource <> '' THEN new_leadsource 
                               ELSE NULL 
                             END 

这不是case语句的工作方式。 案例陈述就像对WHEN THEN的一系列检查一样。 有点像C开关,每个WHEN之前都有一个中断。 所以你想要的是

UPDATE account
SET new_finalleadsource =
   CASE 
     WHEN new_jtrack_source IS NOT NULL AND new_jtracksource <> '' THEN new_jtrack_source
     WHEN new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> '' THEN new_jrackofflinesource
     WHEN new_leadsource IS NOT NULL AND new_leadsource <> '' THEN new_leadsource
     ELSE NULL
  END

我认为以下内容(基于戈登的回答)是最可靠的解决方案:

UPDATE account
  SET new_finalleadsource = 
    COALESCE(NULLIF(LTRIM(RTRIM(new_jtrack_source)), ''),
             NULLIF(LTRIM(RTRIM(new_jrackofflinesource)), ''),
             NULLIF(LTRIM(RTRIM(new_leadsource)), '')
            );

是。 但是,如果您不想更改该值,则将else更改为else new_finalleadsource

编写语句的一种方法是:

UPDATE account
    SET new_finalleadsource = (CASE WHEN new_jtrack_source IS NOT NULL AND new_jtracksource <> '' 
                                    THEN new_jtrack_source

                                    WHEN new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> '' 
                                    THEN new_jrackofflinesource
                                    WHEN new_leadsource IS NOT NULL AND new_leadsource <> ''
                                    THEN new_leadsource
                                    ELSE NULL
                                END);

另一种方法是使用COALESCE()NULLIF()

UPDATE account
    SET new_finalleadsource = COALESCE(NULLIF(new_jtrack_source, ''),
                                       NULLIF(new_jrackofflinesource, ''),
                                       NULLIF(new_leadsource, '')
                                      );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM