差异
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
我们想知道性能或其他问题的差异。 它存在更好的方式吗?
答案 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值的开发人员来说可能不是很明显。