我有以下枚举声明:
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
值只是一个例子-稍后,我需要将这些枚举值与以列表示的行值进行比较)
谢谢!
答案 0 :(得分:0)
枚举(enum
)类型是数据类型,因此在创建表结构时应使用
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';
答案 1 :(得分:0)
您可以使用enum_range(null::known_roles_list)
获取枚举的数组列表元素,然后仅使用标准数组运算符。您需要将该数组强制转换为name[]
,否则将无法比较name
和known_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
任何/某些:https://www.postgresql.org/docs/current/static/functions-comparisons.html#id-1.5.8.28.16