SQL UPDATE基于其他列

时间:2016-01-28 16:29:32

标签: sql sql-server

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

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

不确定是否可以这种方式使用大小写,我基本上是尝试使用其他3列中的1列来更新列,具体取决于具有数据的第一列。

由于

3 个答案:

答案 0 :(得分:1)

您不需要多个CASE语句,而是使用带有多个Case表达式的单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 

答案 1 :(得分:1)

这不是case语句的工作原理。案例陈述就像是对当时的一系列检查。有点像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)), '')
            );

答案 2 :(得分:1)

是。但是,如果您不想更改该值,请将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, '')
                                      );