我有很多过程依赖于根据某些配置变量的值执行不同的查询。例如,它将是类似的东西
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中没有IF,where
是您的逻辑工作马。所以类似于:
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(,也不能直接调用。