Postresql:如何检查varchar数组中每个项目的正则表达式约束



目前我发现的一种工作方式是:

create or replace function check_array(
  p_v varchar[]
)
returns boolean
language plpgsql as
$$
  declare
    v_v varchar;
  begin
    foreach v_v in array p_v
    loop
      if (v_v !~ '^foo.$')
        then return false;
      end if;
    end loop;
    return true;
  end;
$$;
create table tmp1 (v varchar[] check (check_array(v)));

现在如预期:

insert into tmp1(v) values ('{"foo1,foo2"}'); works,

insert into tmp1(v) values ('{"foo1,foo22"}');失败


但是是否可以不使用plsql函数,例如:

create table tmp2 (i integer[] check (1000 >= all(i)));

行得通,因为运算符all在比较的右侧。但是我需要它在左边,以便使用正则表达式比较~,像这样(不工作):

create table tmp3 (v varchar[] check (all(v) ~ '^foo.$'));

可能的解决方案(或者更确切地说是变通方法):

select array_to_string(array['423','342','123'],'SOME_UNIQUE_SEPARATOR') ~ '^(d{3}(SOME_UNIQUE_SEPARATOR)?)+$' ;

但是必须确保数组元素中没有SOME_UNIQUE_SEPARATOR

最新更新