0

您好,我是 SQL 新手,我想使用 Case 语句。

我目前有这个 SQL 语句

update tblAccount set FullName = rtrim(isnull(FirstName,''));
update tblAccount set FullName = FullName + ' ' + rtrim(MI)
where substring(reverse(MI),1,1)='.';
update tblAccount set FullName = FullName + ' ' + rtrim(MI) + '.'
where substring(reverse(MI),1,1)!='.'
and MI is not null and len(rtrim(MI)) = 1;
update tblAccount set FullName = FullName + ' ' + rtrim(MI) 
where len(rtrim(MI)) >= 2;
update tblAccount set FullName = FullName + ' ' + LastName;
update tblAccount set FullName = FullName + ', ' + Suffix 
where Suffix is not null
and len(rtrim(Suffix)) > 0;

我想把它转换成更小更易读的东西,有人告诉我 Case 语句可能会有所帮助,但我很熟悉它,我想知道是否有人能够帮助将它转换成更易读的东西。

4

3 回答 3

2

可以写成一个语句,但是因为你的代码重新修改了同一列,你必须嵌套和组合函数调用,这将是一个绝对巨大的语句,因此远不如你当前的代码可读。

此外,执行顺序很重要,因此维护和调试单个语句会更加困难。

保持原状。你所拥有的是好的。


关于性能,我可以说代码的维护和清晰度每次都超过性能(只要性能是“可接受的”)。

也就是说,您当前的调用每个都需要全表扫描,而单个语句只需要一个。但是,根据表的大小,在第一次扫描后,表可能会缓存在内存中,并且单个语句可能非常复杂,以至于它实际上比您当前的代码慢。

您必须对其进行测试,但除非出现问题,否则您不应该考虑性能 - 不要过早优化您的代码。

于 2012-06-14T18:41:34.767 回答
1

我会像这样重写它,只是在性能上稍微升级,但我认为它的可读性更高,就像@Bohemian 所说的那样。

--MIDDLE NAME?
    update tblAccount 
    set FullName = 
                    case when  substring(reverse(MI),1,1)='.' THEN --  FIRST + SECOND UPDATE
                        rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI)
                    case when substring(reverse(MI),1,1)!='.' and MI is not null and len(rtrim(MI)) = 1 THEN --FIRST AND THIRD UPDATE
                        rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI) + '.'
                    else  -- FIRST UPDATE
                         rtrim(isnull(FirstName,''));
                    end 

    GO      
    -- LASTNAME     
    update tblAccount 
    set FullName = case when len(rtrim(MI)) >= 2 THEN
                        (FullName + ' ' + rtrim(MI)) + ' ' + LastName
                    else
                        FullName + ' ' + LastName;
                    END
    GO

    -- SUFFIX
    update tblAccount 
    set FullName = FullName + ', ' + Suffix 
    where Suffix is not null
    and len(rtrim(Suffix)) > 0;
于 2012-06-14T19:05:48.110 回答
0

一般形式是

CASE WHEN <condition> THEN <value> ELSE <somethingElse> END

在哪里WHEN <condition> THEN <value>可以重复并且ELSE <somethingElse>是可选的

case 语句可以用作控制结构,如在存储过程或脚本中,或内联,如SELECT.

您的更新语句等效于:

UPDATE tblAccount SET FullName = 
    rtrim(isnull(FirstName,''))
    + CASE 
        WHEN substring(reverse(MI),1,1)='.' THEN ' ' + RTRIM(MI)  
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
        WHEN MI is not null and len(rtrim(MI)) = 1 THEN rtrim(MI) + '.'
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
        ELSE
            + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END
    END
    + ' ' + LastName
    + CASE 
        WHEN Suffix IS NOT NULL AND len(rtrim(Suffix)) > 0 THEN ', '+Suffix 
    END

您有 6 次更新,nrs 1、5 和 6 很简单,它们几乎被复制到上面的一个语句中。2 的记录更新不会被 3 触及,并且 4 可以(根据您的代码,数据可能证明并非如此)与 2、3 或两者都不发生,因此 4 的重复。


当然,我完全不同意你的陈述很好的论点。如果您需要的是一次更新,那就是一次更新。也不要因为接受不回答而屈服于压力。

玩得开心!

在你学习的时候也看看 COALESCE() 。

于 2012-06-14T18:47:32.237 回答