一种工作方式:
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"}');
有效,
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.$'));
答案 0 :(得分:1)
可能的解决方案(或更确切地说是解决方法):
select array_to_string(array['423','342','123'],'SOME_UNIQUE_SEPARATOR') ~ '^(\d{3}(SOME_UNIQUE_SEPARATOR)?)+$' ;
但是你必须确保没有数组元素包含SOME_UNIQUE_SEPARATOR。