我希望这个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在这两列中的任何一列返回的行
答案 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_matches
中WHERE
中有多少行),因此需要使用SRF来避免:
错误:WHERE的参数不能返回集合
Read和类似的