【问题标题】:Alternative for IF statement in plsql select Intoplsql 中 IF 语句的替代选择 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

【问题讨论】:

    标签: sql oracle if-statement plsql select-into


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多