plsql 中 IF 语句的替代选择 Into

Posted

技术标签:

【中文标题】plsql 中 IF 语句的替代选择 Into【英文标题】:Alternative for IF statement in plsql select Into 【发布时间】:2021-06-23 11:59:42 【问题描述】:

我有一个使用 IF 条件的 select 语句,如下所示

If (v_block = 'apple')
then

select count(*) into v_apple_id
from table_fruits
where fruit_id = v_fruit_id;

elsif (v_block = 'mango')
then
select count(*) into v_mango_id
from table_fruits
where fruit_id = v_fruit_id;

end if;

如何通过避免使用 IF 语句来优化此查询。

v_fruit_id 将取决于 v_block 中的值。例如。如果 v_block = 'Mango' 则 v_fruit_id 将为 1234,如果 v_block = 'apple' 则 v_fruit_id 将为 1244。此处的数字(如 1234 或 1244)并不总是相同,因此应给出变量 v_fruit_id 而不是硬编码数字

我不想在这里使用 IF Else 语句,因为 v_block 有更多值,所以为了避免使用 IF else 进行大查询,我想为它找到一个替代的简单选择语句。

我还需要 into 变量来根据结果。如果是 v_block = mango,那么它应该是 v_mango_id,如果是苹果,那么它应该是 v_apple_id

【问题讨论】:

【参考方案1】:

在我看来,您尝试这样做错误

您不能也不应该为所有水果设置单独的变量。好的,现在你只有两个 - v_apple_idv_mango_id。香蕉来了怎么办?你会创建另一个v_banana_id 并修改你的程序的整个代码吗?幸运的是,你会在一两个小时内完成。明天,您将收到v_peach_idv_pear_id。然后呢?

正如我所说 - 完全错误的方法。


我不知道v_block 代表什么(您从未发布过有关整个问题的太多信息),所以这里的代码应该是这样的(再次,在我看来):

CREATE OR REPLACE PROCEDURE p_fruit (
   par_fruit_id  IN table_fruits.fruit_id%TYPE)
IS
   v_count  NUMBER;
BEGIN
   SELECT COUNT (*)
     INTO v_count
     FROM table_fruits
    WHERE fruit_id = par_fruit_id;
END;
/

换句话说:创建一个将接受水果 ID 作为参数并稍后在其代码中使用它的过程。这是一般方法。它可能需要更改,但是 - 这取决于您真正想要做什么。也许它应该只是转换为一个返回例如数量的函数。苹果...目前无法判断。

【讨论】:

【参考方案2】:

看来您需要一个CASE ..WHEN 表达式,例如

SELECT COUNT(*)
  INTO v_apple_id
  FROM table_fruits
 WHERE fruit_id = CASE WHEN v_block = 'Mango' THEN 1234
                       WHEN v_block = 'Apple' THEN 1244 END

同时去掉v_fruit_id参数

【讨论】:

谢谢,但我还需要根据结果输入变量。如果是 v_block = mango,那么它应该是 v_mango_id,如果是苹果,那么它应该是 v_apple_id

以上是关于plsql 中 IF 语句的替代选择 Into的主要内容,如果未能解决你的问题,请参考以下文章

在这个简单示例中替代 if 语句

plsql insert into语句报错原因是?

PLSQL forall 中遇到符号“IF”

如何使用plsql导出oracle数据建表语句,存储过程,视图.以及表中数据

PLSQL如何导出、导入数据,如果使用语句怎么写?!(DOS命令也可以)

mybatis 中用insert into select ..... 报错命令未正确结束,但把这句sql放到plsql中执行正常