0

差异

  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

或全部计数

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

4

1 回答 1

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 值可能不是很明显。

于 2011-01-26T17:39:57.977 回答