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

时间:2018-08-20 04:13:22

标签: sql postgresql enums

我有以下枚举声明:
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值只是一个例子-稍后,我需要将这些枚举值与以列表示的行值进行比较)

谢谢!

2 个答案:

答案 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[],否则将无法比较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

任何/某些:https://www.postgresql.org/docs/current/static/functions-comparisons.html#id-1.5.8.28.16