在Oracle SQL查询中使用嵌套大小写条件时出现问题

在Oracle SQL查询中使用嵌套大小写条件时出现问题,sql,oracle,nested,case,Sql,Oracle,Nested,Case,我有一个场景,在这个场景中,我需要使用一个包来计算员工的工资,如果有预付款,该包将为我提供永久员工的剩余工资,然后使用另一个包将计算值转换为员工指定的货币 我是如何做到这一点的: CASE WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y') THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id ) ELSE ail.amount_r

我有一个场景,在这个场景中,我需要使用一个包来计算员工的工资,如果有预付款,该包将为我提供永久员工的剩余工资,然后使用另一个包将计算值转换为员工指定的货币

我是如何做到这一点的:

CASE
  WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
  THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
  ELSE ail.amount_remaining
END amount_remaining,
CASE
  WHEN ( ai.salary_currency_code = NVL(find_currency('EMP_COMMON_CURRENCY'),ai.EMP_CURRENCY_CODE))
  THEN CASE
             WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
                THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
             ELSE ail.amount_remaining
  END
  ELSE EMP_API.convert_closest_amount_sql( x_from_currency => ai.EMP_CURRENCY_CODE ,x_to_currency => find_currency('EMP_COMMON_CURRENCY') ,x_amount =>( CASE
             WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
                THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
             ELSE ail.amount_remaining
END) ,x_max_roll_days => -1)
END EMP_CONVERTED_AMOUNT_REMAINING, 
我在查询中重复了以下条件3次:

WHEN ( ai.employee_type = 'PERMANENT' and ai.payment_status_flag='Y')
   THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
   ELSE ail.amount_remaining

有没有一种更简单的方法,我们可以避免重复这样的代码吗?

您可以在
FROM
子句中使用内联视图来简化此过程。在实时代码中正确使用连接

SELECT amount_remaining
     , CASE
          WHEN ai.salary_currency_code = NVL(find_currency('EMP_COMMON_CURRENCY')
                                            ,ai.EMP_CURRENCY_CODE)
               THEN amount_remaining

          ELSE EMP_API.convert_closest_amount_sql(
                   x_from_currency => ai.EMP_CURRENCY_CODE
                  ,x_to_currency => find_currency('EMP_COMMON_CURRENCY')
                  ,x_amount => amount_remaining
                  ,x_max_roll_days => -1)
        END EMP_CONVERTED_AMOUNT_REMAINING,
FROM (SELECT CASE
               WHEN ai.employee_type = 'PERMANENT'
                AND ai.payment_status_flag='Y'
                    THEN EMP_UTILS_PKG.get_pay_amount_remaining( ai.employee_id )
               ELSE ail.amount_remaining
             END amount_remaining
        FROM table_name);

您已经在使用函数
EMP\u UTILS\u PKG.get\u pay\u amount\u remain
,那么为什么不创建一个PL/SQL函数来封装逻辑并在多个位置调用它呢。

我已经对它进行了编辑以添加缺少的行,您能告诉我是否有办法避免上述重复的代码吗。