SQL中的case语句

时间:2012-06-14 18:31:10

标签: sql

您好我是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声明可能会有所帮助,但我很熟悉它,我想知道是否有人能帮助将其转换为更易读的内容。

3 个答案:

答案 0 :(得分:2)

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

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

保持原样。你拥有的是好的。


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

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

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

答案 1 :(得分: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;

答案 2 :(得分:0)

一般表格是

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

可以重复WHEN <condition> THEN <value>ELSE <somethingElse>是可选的

案例陈述可以用作控制结构,如存储过程或脚本,或内联,如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()。