我如何在Postgres的数组长度中使用或使用谓词

时间:2018-02-08 02:29:15

标签: sql regex postgresql

我希望这个sql是自解释的

select documentno, (regexp_matches(text, '|([^|]*)|'))[0] cat, (regexp_matches(text, '#([^#]*)#'))[0]::date promdate from s_ar_open
union
select documentno, (regexp_matches(text, '|([^|]*)|'))[0] cat, (regexp_matches(text, '#([^#]*)#'))[0]::date promdate from h_ar_open
where (array_length(regexp_matches(text, '|([^|]*)|'),1) > 0) or (array_length(regexp_matches(text, '#([^#]*)#'),1) > 0)

代码似乎是一个挑战。无论如何,我得到参数或者不能返回一个集合,但是array_length不会使regexp_matches结果变平?我只是在寻找regexp在这两列中的任何一列返回的行

1 个答案:

答案 0 :(得分:0)

当你有一场比赛时,你有一排:

t=# with c(s,p) as (values('blah','[a-z]'))
select regexp_matches(s,p),array_length(regexp_matches(s,p),1)
from c;
 regexp_matches | array_length
----------------+--------------
 {b}            |            1
(1 row)

但是这里没有返回任何行:

t=# with c(s,p) as (values('blah','[z]'))
select regexp_matches(s,p),array_length(regexp_matches(s,p),1)
from c;
 regexp_matches | array_length
----------------+--------------
(0 rows)

这里有四个:

t=# with c(s,p) as (values('blah','[a-z]'))
    select regexp_matches(s,p,'g'),array_length(regexp_matches(s,p,'g'),1)
    from c;
 regexp_matches | array_length
----------------+--------------
 {b}            |            1
 {l}            |            1
 {a}            |            1
 {h}            |            1
(4 rows)

所以对于使用array_length on set的第一个样本看起来可用作返回的一行,但在另外两个情况下 - 不是。这种方式array_length不会展平行 - 只是数组元素。因此,您无法使用它(因为规划人员不知道regexp_matchesWHERE中有多少行),因此需要使用SRF来避免:

  

错误:WHERE的参数不能返回集合

Read和类似的