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

时间:2015-06-03 10:19:04

标签: regex postgresql

到目前为止,我发现

一种工作方式

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.$'));

1 个答案:

答案 0 :(得分:1)

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

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

但是你必须确保没有数组元素包含SOME_UNIQUE_SEPARATOR。