如何在PL/pgSQL中的where子句中使用IF语句来简化过程



我有很多过程依赖于根据某些配置变量的值执行不同的查询。例如,它将是类似的东西

IF (check_unit='Y') THEN
SELECT my_key, my_id
INTO l_my_key, l_my_id
FROM data
WHERE my_num = NEW.my_num AND
my_data = NEW.my_date AND
my_unit = NEW.my_unit;
ELSE
SELECT my_key, my_id
INTO l_my_key, l_my_id
FROM data
WHERE my_num = NEW.my_num AND
my_data = NEW.my_date;

这在数据库中的多个过程中反复进行。我认为必须有一种简单的方法来执行IF或其他条件,这样,如果my_unit='Y',我们将使用2 AND执行查询,否则我们将只执行1 AND命令,而不必如此明确地写出两个完整的查询。

我仍然习惯PL/pgSQL,所以如果有一个简单的方法可以做到这一点,我很抱歉。如有任何帮助或指示,我们将不胜感激。如果做这件事的方式是标准的或可接受的方式,那也没关系。

您可以轻松地将IF条件移动到WHERE中的条件表达式中,以选择子句:

SELECT my_key, my_id
INTO l_my_key, l_my_id
FROM data
WHERE (CASE WHEN check_unit = 'Y'
THEN my_num = NEW.my_num AND
my_data = NEW.my_date AND
my_unit = NEW.my_unit
ELSE my_num = NEW.my_num AND
my_data = NEW.my_date
END);

然后简化

SELECT my_key, my_id
INTO l_my_key, l_my_id
FROM data
WHERE my_num = NEW.my_num AND
my_data = NEW.my_date AND
(CASE WHEN check_unit = 'Y' THEN my_unit = NEW.my_unit ELSE TRUE END);

以及进一步的

SELECT my_key, my_id
INTO l_my_key, l_my_id
FROM data
WHERE my_num = NEW.my_num AND
my_data = NEW.my_date AND
(check_unit <> 'Y' OR my_unit = NEW.my_unit);

在SQL中没有IFwhere是您的逻辑工作马。所以类似于:

select my_key, my_id
into l_my_key, l_my_id
from data
where my_num = new.my_num 
and my_data = new.my_date 
and (   new.my_unit  <> 'Y' 
or ( my_unit = new.my_unit and 
new.my_unit  <> 'Y'
) 
) ;

但是,请描述一下你实际想要实现的目标。

以上仅适用于插入或更新行级别的触发器函数。伪行new仅存在于行触发器中,并且在删除触发器中new.x将始终为NULL。此外,触发器不返回值(除了行图像或null(,也不能直接调用。

最新更新