oracle CASE语句嵌套在包含PROMPT和IN的WHERE语句中时出现问题

cbjzeqam  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(149)

我在Oracle Cloud BI Publisher产品内部使用SQL,因此我假设这是真正的SQL或PL/SQL。我正在尝试满足以下条件:当用户选择会计期12(十二月)时,我需要查询来获取会计期12和13(分别为十二月和调整)的所有数据。当我得到一个括号、单引号组合或嵌套的Select语句时,它会起作用;选择提示符(:p_month)12会导致“无效数字”返回。2改变括号,用其他方法引用填充物会在试图保存时从查询中产生直接错误。
对于THEN之后的部分,我尝试了以下分组结果:
“invalid number”从传递语句的提示求值返回:('12''13')('12,13')(从双通道中选择'12,13')(从双通道中选择“'12','13'”)
来自直接查询的“无效标识符”:(从双通道中选择“12,13”)(从双通道中选择“12,13”)
直接查询中“缺少右括号”:(“十二”、“十三”)(“十二”、“十三”)
有问题的代码行就在下面,完整代码在下面:

AND gl_periods.period_num IN (CASE WHEN (:p_month) = '12' THEN ('12','13') ELSE (:p_month) END)
SELECT 
     LPAD(gl_periods.period_num, 2,'0') AS period_num
    ,gl_periods.period_year AS period_year
    ,gl_code_combinations.segment1 AS segment1
    ,gl_code_combinations.segment2 AS segment2
    ,gl_code_combinations.segment3 AS segment3
    ,gl_code_combinations.segment4 AS segment4
    ,gl_code_combinations.segment5 AS segment5
    ,gl_code_combinations.segment6 AS segment6
    ,gl_code_combinations.segment7 AS segment7
    ,gl_ledgers.name AS ledger_name
    ,gl_ledgers.currency_code AS currency_code
    ,gl_balances.begin_balance_dr_beq AS begin_balance_dr
    ,gl_balances.begin_balance_cr_beq AS begin_balance_cr
    ,gl_balances.period_net_dr_beq AS activity_dr
    ,gl_balances.period_net_cr_beq AS activity_cr
    ,(SELECT DISTINCT
        fnd_flex_values_vl.attribute1
      FROM
        fnd_flex_values_vl,
        fnd_flex_value_sets
      WHERE
        1=1
        AND fnd_flex_values_vl.flex_value = gl_code_combinations.segment2
        AND fnd_flex_values_vl.flex_value_set_id = fnd_flex_value_sets.flex_value_set_id 
        AND fnd_flex_value_sets.flex_value_set_name = 'CostCenter XXX Enterprise') AS reporting_unit_code
    ,(SELECT DISTINCT
        fnd_flex_values_vl.attribute7
      FROM
        fnd_flex_values_vl,
        fnd_flex_value_sets
      WHERE
        1=1
        AND fnd_flex_values_vl.flex_value = gl_code_combinations.segment2
        AND fnd_flex_values_vl.flex_value_set_id = fnd_flex_value_sets.flex_value_set_id
        AND fnd_flex_value_sets.flex_value_set_name = 'CostCenter XXX Enterprise') AS operating_country_code
    ,(SELECT DISTINCT
        fnd_flex_values_vl.attribute6
      FROM
        fnd_flex_values_vl,
        fnd_flex_value_sets
      WHERE
        1=1
        AND fnd_flex_values_vl.flex_value = gl_code_combinations.segment2
        AND fnd_flex_values_vl.flex_value_set_id = fnd_flex_value_sets.flex_value_set_id
        AND fnd_flex_value_sets.flex_value_set_name = 'CostCenter XXX Enterprise') AS legal_country_code 
FROM
    gl_balances
    INNER JOIN gl_code_combinations ON gl_balances.code_combination_id = gl_code_combinations.code_combination_id
    INNER JOIN gl_ledgers ON gl_ledgers.ledger_id = gl_balances.ledger_id
    INNER JOIN gl_periods ON gl_balances.period_name = gl_periods.period_name
 WHERE
    1=1
    AND gl_balances.currency_code <> 'STAT'
    AND gl_balances.actual_flag = 'A'
    AND gl_periods.period_set_name = 'XXX Enterprise'
    AND gl_code_combinations.account_type IN ('A','L','O')
    AND (gl_balances.translated_flag IN ('N','R') OR gl_balances.translated_flag IS NULL)
    AND (gl_ledgers.ledger_id IN (:p_ledger) OR LEAST (:p_ledger) IS NULL)
    AND gl_periods.period_num IN (CASE WHEN (:p_month) = '12' THEN ('12','13') ELSE (:p_month) END)
    AND (gl_periods.period_year IN (:p_year) OR LEAST (:p_year) IS NULL)    
    AND gl_ledgers.ledger_category_code = 'PRIMARY'
    AND gl_ledgers.name NOT LIKE ('%SL%')
6kkfgxo0

6kkfgxo01#

我可以用下面的代码片段得到我想要的回报:

AND (
        (gl_periods.period_num IN (CASE WHEN (:p_month) = '12' THEN '12' ELSE (:p_month) END))
        OR
        (gl_periods.period_num IN (CASE WHEN (:p_month) = '12' THEN '13' ELSE (:p_month) END))
    )

如果有一个更优雅的答案,我很乐意看到它,因为我总是开放的新思想。

相关问题