查询以获取给定正则表达式列表的数据
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);
我必须为给定的正则表达式列表获取数据。对于下面的单个正则表达式,查询有效但对于列表我面临问题
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);