plsql中IF语句的替代select Into

Alternative for IF statement in plsql select Into

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

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 进行大查询,我想为它找到一个替代的简单 select 语句.

我还需要into varibale根据水果。如果是 v_block = mango 那么它应该是 v_mango_id 如果是 apple 那么它应该是 v_apple_id

您似乎需要一个 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_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 作为参数并稍后在其代码中使用它的过程。这是 通用 方法。它可能需要更改,但是 - 这取决于您真正想要做什么。也许它应该 converted 到一个函数,其中 returns 数量例如苹果...暂时无法判断。