首页 > 解决方案 > 如何在对三个不同列具有相同检查条件的 SELECT 查询中优化 CASE 语句

问题描述

我有下面的选择语句来获取具有 CASE 语句的数据。

SELECT  PK_ID
,MGR_ID
,EMP_ID 
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'A' from dual)  
    ELSE
        (SELECT 'B' from dual)  
END FIRST_COL
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'P' from dual)   
    ELSE
        (SELECT 'Q' from dual)
END SECOND_COL
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'X' from dual)
    ELIE
        (SELECT 'Y' from dual)
END THIRID_COL
 from m_sel_tabs msts

在这里,据我所知,我们可以使用多列检查条件,但结果将只有一个 CASE 语句。

所以我的问题在这里,因为我的检查 CASE 语句对于所有三列(FIRST_COL、SECOND_COL、THIRID_COL)都是相同的,因此还有其他方法可以以优化的方式编写此查询。

提前致谢。

标签: oracle10g

解决方案


也许我错了,但是 - 当说你有“相同的 3 个 CASE 陈述”时 - 好吧,你没有。这些是 3种不同的CASE 语句。表达式是相同的,是的,但是您选择了 3 个不同的列,具有不同的结果(A、B、P、Q、X、Y - 在您的示例中)。

您可以创建一个函数来“隐藏”您当前使用的代码并使其SELECT更漂亮,例如

select 
  pk_id, ...,
  f_col(1, MGR_ID, EMP_ID) first_col,
  f_col(2, MGR_ID, EMP_ID) second_col,
  f_col(3, MGR_ID, EMP_ID) third_col
from m_sel_tabs

但是 - 最后 - 它会是一样的(或者,可能因为上下文切换而更糟),因为你必须把所有的代码放在某个地方(到函数中,对吧?)。


推荐阅读