查询以获取给定正则表达式列表的数据

Query to fetch data for list of regular expressions given

我必须为给定的正则表达式列表获取数据。对于下面的单个正则表达式,查询有效但对于列表我面临问题

select id from res r where 
(?1 is null or CAST(r.value AS TEXT) ~ cast(?1 as TEXT));

?1[^\d{3}\d{1,}133\d{1,}$] 并且工作正常

现在当我放入正则表达式列表时 [^\d{3}\d{1,}133\d{1,}$, 75$] 它不起作用

documentation 开始,~ 运算符适用于单个正则表达式。您需要更新您的查询以处理正则表达式列表。例如,

select id from res r where 
(?1 is null or (select bool_and(r.value::text ~ x.exp) FROM unnest(?1)))

如果列与 ?1 中的 all 正则表达式匹配,则 returns 的第二部分为真。根据输入的大小,您可以将 unnest(?1) 提取到 CTE 中。

如果 ?1 类型是文本数组 (text[]) 或文本数组语法的有效文本表示,则

select id from res r where 
?1 is null
or exists (select from unnest(?1::text[]) rx where r.value::text ~ rx);

请注意正则表达式文本数组的语法不得
[^\d{3}\d{1,}133\d{1,}$, 75$]{"^\d{3}\d{1,}133\d{1,}$", 75$}

编辑
如果第一个参数与数组中正则表达式的 any 匹配,那么定义一个 returns true 的函数可能是个好主意。类似于 non-existent 但最好有 REGEX_IN 运算符。

create or replace function regex_any(needle text, haystack_rules text[])
returns boolean language sql immutable as $$
    select exists (select from unnest(haystack_rules) haystack_rule where needle ~ haystack_rule);
$$;

那么您的查询将如下所示:

select id from res r 
 where ?1 is null 
 or regex_any(r.value::text, ?1);