根据传递的参数进行 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

多值模糊查询报表的制作

Mybatis---配置文件完成增删改查(查询详情)

1.Mybatis开发

MYSQL如何根据变量的值来选择字段进行查询

BIRT 中如何根据参数动态拼接 SQL