更好的代码来发展

时间:2011-01-26 17:11:54

标签: sql oracle oraclereports

差异

  select CE1.CLASS_ID, 
         CE1.LOCATION_ID,
         count(case CE1.FORMAT_ID  when 5 then 1 end) as LIVE,
         count(case CE1.FORMAT_ID  when 14 then 1 end) as LB,
         count(case CE1.FORMAT_ID  when 15 then 1 end) as WEB,
         SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY,
         SUM(DECODE  (CE1.ROLE_ID ,2,1,0)) MODERATOR,
         SUM(DECODE  (CE1.ROLE_ID ,3,1,0)) PANELIST,  
         SUM(DECODE  (CE1.ROLE_ID,4,1,0)) PRESENTER,
         COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID

我们正在开发现有系统,我们发现混合使用COUNT和DECODE。 如果我们理解正确,我们可以转换为以下代码。

  select CE1.CLASS_ID,  
         CE1.LOCATION_ID, 
         SUM(DECODE (CE1.FORMAT_ID ,5,1,0)) LIVE,
         SUM(DECODE  (CE1.FORMAT_ID ,14,1,0)) LB, 
         SUM(DECODE  (CE1.FORMAT_ID,15,1,0)) WEB,
         SUM(DECODE (CE1.ROLE_ID,5,1,0)) FACULTY,
         SUM(DECODE  (CE1.ROLE_ID ,2,1,0)) MODERATOR,
         SUM(DECODE  (CE1.ROLE_ID ,3,1,0)) PANELIST,  
         SUM(DECODE  (CE1.ROLE_ID,4,1,0)) PRESENTER,
         COUNT(CE1.USER_ID) TOT 
    from C_EDUCATION1 CE1 
GROUP BY CE1.LOCATION_ID, CE1.CLASS_ID

OR 所有COUNT

我们想知道性能或其他问题的差异。 它存在更好的方式吗?

1 个答案:

答案 0 :(得分:4)

两者之间没有性能差异。

就个人而言,我倾向于选择基于CASE的解决方案。 CASE是ANSI标准,而不是Oracle特定的功能。来自其他数据库平台的开发人员可能必须查找DECODE语句的语义。 CASE对于开发人员来说也是相对明显的,无论他们熟悉哪种语言。实际上,每种语言都有CASE语句,因此任何开发人员都应该能够快速查看您正在做的事情。

话虽这么说,我倾向于提倡像

这样的东西
SELECT ce1.class_id,
       ce1.location_id,
       SUM( CASE WHEN format_pkg.is_live( format_id ) = 'Y' THEN 1 ELSE 0 END ) live,
       SUM( CASE WHEN format_pkg.is_lb(   format_id ) = 'Y' THEN 1 ELSE 0 END ) lb,
       ...

这使用来自第一个查询的CASE,来自第二个查询的SUM,并添加一些函数调用以确定正在讨论的格式/角色的类型。这可以防止您必须在整个地方硬编码FORMAT_ID / ROLE_ID值。并且使用SUM而不是COUNT会更清楚一点,因为对COUNT排除NULL值的开发人员来说可能不是很明显。