2012-06-14 48 views
0

你好我是SQL新手,我想使用Case语句。SQL中的案例陈述

我现在有这条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语句可能会帮助,但我familar有了它,我在想,如果任何人都可以帮助将其转换为更具可读性的内容。

+0

您使用的是SQL Server吗?甲骨文? MySQL的?答案可能因此而异。 –

回答

2

可能被做成一个语句,但因为你的代码重新修改同一列,你将不得不嵌套和组合函数调用,这将是一个绝对巨大的声明,因此远不如当前可读性码。

另外,执行的顺序很重要,所以维护和调试单个语句会困难得多。

保持原样。你有什么是好的。


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

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

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

+0

我打算说和你一样,但维护和调试会更简单,但性能如何? –

+0

@Mr好点。我已经添加了笔记重新性能 – Bohemian

+0

是我看到的是,他的陈述中有6个完整的扫描,而不是一个,我将尝试在一个声明中做出来,让我们看看它是如何可读的xD –

0

的一般形式是

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

哪里WHEN <condition> THEN <value>可以重复和ELSE <somethingElse>是可选

case语句可以使用AA的控制结构,如在存储过程中或一个脚本,或内联,如在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(),当你在学习的时候。

+0

你低估了我的回答(意思是“没用”)?考虑一次性声明的*可读性,以及添加诸如修正大写字母这样的交叉切割的难度,在您的查询中需要将该代码添加到您的案例的每个分支。它一次性完成并不是可扩展的,也不是一个好主意。只是因为你*可以*在代码中做某件事,并不意味着你*应该* – Bohemian

+0

@Bohemian我的观点是:仅仅因为它*有点难*,并不意味着你不应该*尝试*。看到我的评论。 至于可读性,我没有看到原始文件,另一个解决方案和一次性答案之间的任何差异,这些都不能用空格来解决。至于复杂性......所有Emre801需要更新一列,并结合其他条件。一步式解决方案更接近于此,因此不那么复杂。 至于可伸缩性,这不是问题。你的最后两条陈述有没有什么肉?'它只是不可扩展'*和*'也不是一个好主意'*? – jos

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; 
+0

我同意旧的方式更具可读性,我很好奇如何使用病例陈述,因为我的朋友建议我这样做。 – Emre801

+0

这一个可以帮助你?,我分裂了六个更新在3,为可读性,在步骤分裂,我不认为你应该分裂它更多你认为@bohemian –