oracle10g - 如何在对三个不同列具有相同检查条件的 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)都是相同的,因此还有其他方法可以以优化的方式编写此查询。
提前致谢。
解决方案
也许我错了,但是 - 当说你有“相同的 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
但是 - 最后 - 它会是一样的(或者,可能因为上下文切换而更糟),因为你必须把所有的代码放在某个地方(到函数中,对吧?)。