根据传递的参数进行 SQL 查询
Posted
技术标签:
【中文标题】根据传递的参数进行 SQL 查询【英文标题】:SQL query according to parameter passed 【发布时间】: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',三个都选了?
【问题讨论】:
【参考方案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 - 我认为更新后的会起作用..只需检查并确认!以上是关于根据传递的参数进行 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章