Redshift:如何从字符串列表中匹配最长的正则表达式字符串
Posted
技术标签:
【中文标题】Redshift:如何从字符串列表中匹配最长的正则表达式字符串【英文标题】:Redshift: how to match longest regex string from a list of strings 【发布时间】:2021-09-10 15:14:06 【问题描述】:上下文:
我目前正在解析错误消息,我的方法是用自定义错误类型标记最长的字符串,虽然有点笨拙。 所以我有一个这样的子字符串字典:
'abcdefg' : 'Error A', '1234' : 'Error B', 'aaa' : 'Error C'
例如:
如果我有一个错误字符串:
'abcdefg1234'
,我想将它与错误 A 匹配,因为 abcdefg
是消息中最长的标记子字符串。
'abc1234aaa'
将返回 'Error B'
。
我相信这个想法是先追加最长的子字符串,然后加入标签字典表。
我知道如何进行 1 次正则表达式匹配,但我不知道如何遍历列表以找到最长的匹配项。
【问题讨论】:
【参考方案1】:SQL 不是过程语言,也没有循环的概念(通常)。我喜欢将其视为一种并行合并和过滤语言。因此,要执行您想要的操作,您需要执行几个步骤
-
将您的 json 字典转换为表格
将此表加入到正在评估错误字符串的表中的 LIKE 条件下,该条件测试错误测试值是否在错误字符串中
评估每个匹配的长度并排序这些长度以找到最长的(窗口函数 row_number() 将是我的选择)
生成的 SQL 将类似于:
SELECT error_message,
TYPE
FROM (
SELECT error_message,
TYPE,
Row_number () over (PARTITION BY error_message ORDER BY length DESC) AS rn
FROM message_table
left join
(
SELECT 'Error A' AS TYPE,
Json_extract_path_text(pattern_json, 'Error A') AS pattern,
Len(Json_extract_path_text(pattern_json, 'Error A')) AS length
union ALL
SELECT 'Error B' AS TYPE,
json_extract_path_text(pattern_json, 'Error B') AS pattern,
len(json_extract_path_text(pattern_json, 'Error B')) AS length
UNION ALL
SELECT 'Error C' AS TYPE,
json_extract_path_text(pattern_json, 'Error C') AS pattern,
len(json_extract_path_text(pattern_json, 'Error C')) AS length )
ON pattern LIKE '%'+pattern+'%'
)
WHERE rn = 1;
此代码未经测试,我对您正在做的事情做了一些假设,但希望这将为您提供一条起点。
【讨论】:
以上是关于Redshift:如何从字符串列表中匹配最长的正则表达式字符串的主要内容,如果未能解决你的问题,请参考以下文章