如何检查表中是否存在值-Postgres PLPGSQL

态度比坦斯基

ERD

使用者
ID
名称
团体
ID
名称
users_in_groups
用户身份
group_id

问题总结

我正在postgres中编写一个存储过程,该存储过程接收一个组名users数组并将用户添加到该组中,我想首先断言该用户存在于其中users-因为我想引发一个自定义错误,以便我可以捕获它服务器(如果我依赖于-等默认错误FK violation,则无法在服务器中对其进行足够明确的分类)。

存储过程

CREATE FUNCTION add_users_to_group(group_name text, users text[])
RETURNS VOID AS $$
DECLARE
  does_all_users_exists boolean;
BEGIN
  SELECT exist FROM (
    WITH to_check (user_to_check) as (select unnest(users))
    SELECT bool_and(EXISTS (
       SELECT * FROM users where id = to_check.user_to_check
    )) as exist from to_check) as existance INTO does_all_users_exists;

  IF NOT does_all_users_exists THEN
    RAISE EXCEPTION '%', does_all_users_exists USING ERRCODE = 'XXXXX';

  -- TODO: loop through each user and insert into users_in_groups
END;
$$ LANGUAGE PLPGSQL VOLATILE STRICT SECURITY INVOKER;

问题

当我对users中存在的用户执行该函数时,会抛出错误,并且消息为:(f因此我的变量为false),但是当我仅运行查询时,该查询为我提供了所有用户的存在:

WITH to_check (user_to_check) as (select unnest(users))
    SELECT bool_and(EXISTS (
       SELECT * FROM users where id = to_check.user_to_check
    )) as exist from to_check

我懂了true但我把它放在这样的表中:

存在(布尔)
1个 真正

所以我想我需要以某种方式提取真实信息。

无论如何,我知道在插入之前验证存在是否有更好的解决方案,欢迎提出建议。

戈登·利诺夫

您的逻辑似乎不必要地复杂。您可以使用NOT EXISTS以下命令检查是否不存在任何用户

SELECT 1
FROM UNNEST(users) user_to_check
WHERE NOT EXISTS (SELECT 1 FROM users u WHERE u.id = user_to_check)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章