目前我发现的一种工作方式是:
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