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_id
和 v_mango_id
。香蕉来了怎么办?你会创建另一个 v_banana_id
并修改你的程序的整个代码吗?幸运的是,您将在一两个小时内完成。明天,您将获得 v_peach_id
和 v_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 数量例如苹果...暂时无法判断。
我有一个 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_id
和 v_mango_id
。香蕉来了怎么办?你会创建另一个 v_banana_id
并修改你的程序的整个代码吗?幸运的是,您将在一两个小时内完成。明天,您将获得 v_peach_id
和 v_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 数量例如苹果...暂时无法判断。