如何在红移中进行动态正则表达式匹配?

Posted

技术标签:

【中文标题】如何在红移中进行动态正则表达式匹配?【英文标题】:How to do dynamic regex matching, in redshift? 【发布时间】:2017-09-04 13:31:11 【问题描述】:

所以,我有一个表,其中一列(比如 A)是“字符串”,另一列具有相应的“正则表达式模式”,是否可以检查正则表达式是否与每一列的 A 列中的字符串值匹配在表中动态?如果没有,是否有任何其他工具可以与 redshift 集成以进行动态正则表达式匹配?

【问题讨论】:

select * from table where column_a ~ column_with_regex? docs.aws.amazon.com/redshift/latest/dg/… 我之前尝试过这种方式,它会抛出这个错误The pattern must be a valid UTF-8 literal character expression上述方式只适用于我提供字符串文字。 【参考方案1】:

因此,我找到了解决此问题的方法,结果证明您无法在 redshift 中进行动态正则表达式匹配,但您可以使用 python UDF 来实现这一点,这是 aws redshift cluster 提供的功能之一。

【讨论】:

这是一个确认。是的。您建议的是将列与静态正则表达式匹配。该问题指出匹配必须以动态方式完成,正则表达式也可以用作表中的值。所以,是的,这是一种解决方法。 您可以使用 Python UDF,是的,但它们的扩展速度非常慢,至少在我们的用例中是这样。你没发现这是个问题吗?【参考方案2】:
CREATE OR REPLACE FUNCTION regex_match(input_str character varying, in_pattern character varying)
RETURNS character varying AS
'import re
if re.match(in_pattern,input_str):
       a=input_str
else:
       a ="False"
return(a)
End'
LANGUAGE plpythonu STABLE;

一旦我们创建了上面的函数,下面的查询会对来自两个不同表的列进行正则表达式匹配,并返回匹配的字符串,其中一个表有字符串,另一个表有模式。

select distinct regex_match from 
(select  regex_match(t1.col1,t2.col2) as regex_match
from t1, t2)
where regex_match<>'False'

【讨论】:

【参考方案3】:

假设您有变量列 variable 并且您想要实现正则表达式 '.*variable.*' 您可以将您的正则表达式分成两部分,然后将拆分的部分与您的变量连接起来,例如:

'.*' + variable + '.*'

我知道这有点老套,但它可能比使用 UDF 方法更省力。

编辑: 实际上,这仅在 WITH 子句中键入模式时才有效,而不是当您从表中提取数据时,因此此解决方案不起作用。

【讨论】:

以上是关于如何在红移中进行动态正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式的结果进行进一步匹配?

如何选择特定范围(使用红移正则表达式)

正则表达式/红移

红移中的正则表达式

红移中的正则表达式

亚马逊红移中的 SQL 正则表达式 substr 函数