【问题标题】:SQL query according to parameter passed根据传递的参数进行 SQL 查询
【发布时间】:2020-06-25 13:34:35
【问题描述】:

我有一个条件,如果传递的参数是 US,那么我希望 input_value 是 “计算的小时数”,如果是 CA,那么我希望它是“HRS”和“小时数”,如果我没有通过任何东西,那么应该选择所有三个。

Select element_name
from element_tab JOIN
INPUTVAL_TAB
where ELEMENT_TAB.LEGISLATION_CODE = nvl(:P_LC,ELEMENT_TAB.LEGISLATION_CODE)
AND INPUTVAL_TAB.INPUT_ID = ELEMENT_TAB.INPUT_ID
AND INPUTVAL_TAB.BASE_NAME = DECODE(:p_LC,'US','Hours Calculated','CA','HRS','CA','Hours')

如何更改上述查询,以便如果我不传递 :p_LC 参数,则 'Hours Calculated','HRS' 和 'Hours',三个都选了?

【问题讨论】:

    标签: sql oracle oracle-sqldeveloper


    【解决方案1】:

    您可以检查空值:

    AND (
         (:p_LC IS NULL
          AND INPUTVAL_TAB.BASE_NAME IN ('Hours Calculated', 'HRS', 'Hours'))
      OR (:p_LC IS NOT NULL
          AND INPUTVAL_TAB.BASE_NAME = DECODE(:p_LC,'US','Hours Calculated','CA','HRS','CA','Hours'))
    )
    

    对于将来维护此功能的人来说,这样做可能会更清楚:

    AND (
         (:p_LC IS NULL AND INPUTVAL_TAB.BASE_NAME IN ('Hours Calculated', 'HRS', 'Hours'))
      OR (:p_LC = 'US' AND INPUTVAL_TAB.BASE_NAME = 'Hours Calculated')
      OR (:p_LC = 'CA' AND INPUTVAL_TAB.BASE_NAME IN ('HRS', 'Hours'))
    )
    

    我已经用 NVL 检查了 :p_lc 的空值

    不相关,但我个人更愿意以同样的方式进行第一次检查;所以而不是:

    where ELEMENT_TAB.LEGISLATION_CODE = nvl(:P_LC,ELEMENT_TAB.LEGISLATION_CODE)
    

    我愿意:

    where (
      :p_LC IS NULL
      OR ELEMENT_TAB.LEGISLATION_CODE = :p_LC
    )
    

    ...但这在很大程度上是一个品味问题。

    【讨论】:

    • IF :P_LC IS NULL 我希望传递所有三个 base_name('HRS'、'Hours' 和 'Hours Calculated'),上面的查询没有这样做......
    • 我已经用 NVL 检查了 :p_lc 空值...
    • 除了 'HRS'、'Hours' 和 'Hours Calculated' 之外还有其他值吗?
    • @SHSH_123 - 好的,我认为这个问题根本没有过滤。还有其他人吗?我已经更新为只寻找这三个。
    • @AlexPoole - 我认为更新后的会起作用..只需检查并确认!
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多