PostgreSQL - 检查值是否等于枚举值

6
我有以下枚举声明:
CREATE TYPE known_roles_list AS ENUM ('role1', 'role2')

当数据库执行某个查询时,我希望检查它们是否使用其中一种角色,如果没有,则让查询继续进行。类似这样的操作:
IF current_user NOT IN known_roles_list THEN
    RETURN OLD; 
END IF;

显然,上面的代码不起作用(引发了运行时比较错误)。将枚举值解压(unnest())并在其中搜索也不行。
我该如何进行搜索,并查看枚举值中是否有任何一个与current_user值匹配?(current_user值只是一个示例 - 后来,我需要将这些枚举值与行值进行比较,由列表示)
谢谢!

您可以使用行级安全性并在每个表上添加策略。 - Laurenz Albe
此外,使用表格而不是枚举。 - Laurenz Albe
2个回答

8

您可以使用 enum_range(null::known_roles_list) 获取枚举类型的数组,并使用标准数组操作符。您需要将该数组转换为 name[],否则无法比较 nameknown_roles_list[]

postgres=> SELECT enum_range(null::known_roles_list);
  enum_range
---------------
 {role1,role2}

postgres=> SELECT current_user;
 current_user
--------------
 lkaminski

postgres=> SELECT current_user = any(enum_range(null::known_roles_list)::name[]);
 ?column?
----------
 f

postgres=> SELECT 'role2'::name = any(enum_range(null::known_roles_list)::name[]);
 ?column?
----------
 t

枚举函数: https://www.postgresql.org/docs/current/static/functions-enum.html

Any/Some: https://www.postgresql.org/docs/current/static/functions-comparisons.html#id-1.5.8.28.16


4
枚举类型是一种数据类型,因此应在创建表结构时使用。
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
    name text,
    current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接