在Oracle SQL查询中使用嵌套大小写条件的问题
问题描述:
我有一个场景,我需要使用一个包来计算employeee工资,如果有一些预付款给了我永久雇员的工资,然后将计算出的值转换为员工使用其他软件包指定的货币。在Oracle SQL查询中使用嵌套大小写条件的问题
如何我一直在做的是:
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_UTILS_PKG.get_pay_amount_remaining
为什么不创建一个封装了逻辑并调用在你的多个地方一个PL/SQL函数。
我已经编辑它来添加缺少的行,你能告诉我,如果有一种方法可以避免重复代码提到的问题。 – Chaitanya 2013-03-20 11:33:03
已编辑。请检查。 – Rachcha 2013-03-20 11:36:57