PostgreSQL:查找一个域允许的所有值

k3bvogb1  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(122)

假设我创建了以下域:

CREATE DOMAIN MY_STATUS AS VARCHAR NOT NULL DEFAULT 'STATUS0' CHECK(VALUE in ('STATUS1', 'STATUS2', 'STATUS3'));

字符串
正如预期的那样,在类型为MY_STATUS的列中,我只能放入以下值:

  • '状态0'
  • 'STATUS1'
  • 'STATUS2'
  • 'STATUS3'

现在,假设我想在向我的DB发送插入或更新之前验证这个列。我需要知道哪些值是允许的,这样,如果我的status = STATUS4,我将在发送插入到DB之前有一个错误,我可以管理它。由于域在将来可能会改变,我需要从DB中选择所有允许的值,而不是硬编码所有可能的值来创建常量。
简而言之:如何进行选择域的所有可能值的查询?在我的例子中,我想有一个查询,它将返回:

'STATUS0', 'STATUS1', 'STATUS2', 'STATUS3'

xtfmy6hx

xtfmy6hx1#

我建议您使用外键引用,而不是类型或check约束。虽然你可以设计一个复杂的查询来解析the约束,但使用外键会更容易:

create table valid_domain_statuses (
    status varchar(32) primary key
);

insert into valid_domain_statuses (status)
    select 'STATUS0' union all
    select 'STATUS1' union all
    select 'STATUS2' union all
    select 'STATUS3' ;

. . .

alter table t add constraint fk_my_status
    foreign key (status) references valid_domain_statuses(status);

字符串
这具有其他优点:

  • 您可以通过查看该表很容易地看到有效值。
  • 您可以添加有关状态的其他信息。
  • 很容易添加新的状态值。
h22fl7wq

h22fl7wq2#

检索域的检查约束值列表是可能的。您需要使用正则表达式检查域的文本声明,搜索“值”模式。下面是我的一个函数,它将所有允许的值作为JSON数组列出。

--
-- function:  jget_domain_values
-- purpose:   Produce a JSON array with all the check constraint values of a domain type
-- returns:   A JSON array.
-- since:     1.2.20
--
create or replace function jget_domain_values (
  _domain_name varchar
)
returns json
stable language sql as $$
  select 
    -- aggregate a JSON array after removing the first and last character
    -- of the captured values, which include apostrophes
    json_agg(substring(tj.l from 2 for char_length(tj.l)-2))
  from (
    -- capture the check constraint values of tlang from pg_constraint table
    select  (regexp_matches(pg_get_constraintdef(tc.oid), '''\w+''', 'g'))[1] as l
    from    pg_namespace tn
    join    pg_constraint tc on tn.oid = tc.connamespace
    join    pg_type tt on tt.oid = tc.contypid
    where   tn.nspname = current_schema()
    and     tt.typname = _domain_name
  ) tj;
$$;

字符串
这是另一个函数,返回一组变量

--
-- function:  get_domain_values
-- purpose:   Produce a JSON array with all the check constraint values of a domain type
-- returns:   a set of values
-- since:     1.2.20
--
create or replace function get_domain_values (
  _domain_name varchar
)
returns setof varchar
stable language sql as $$
  -- remove the apostrophes at the first and last characters of the captured values
  select 
    substring(t.l from 2 for char_length(t.l)-2)
  from (
    -- capture the check constraint values of tlang from pg_constraint table
    select  (regexp_matches(pg_get_constraintdef(tc.oid), '''\w+''', 'g'))[1] as l
    from    pg_namespace tn
    join    pg_constraint tc on tn.oid = tc.connamespace
    join    pg_type tt on tt.oid = tc.contypid
    where   tn.nspname = current_schema()
    and     tt.typname = _domain_name
  ) t;
$$;

相关问题