【问题标题】:Matching consecutive digits REGEXP_REPLACE in Redshift匹配 Redshift 中的连续数字 REGEXP_REPLACE
【发布时间】:2019-06-02 17:49:00
【问题描述】:

我正在尝试从 Redshift 中的字符串中删除连续数字。

来自'16,16,16,3,3,4,16,16,' 我想得到'16,3,4,16,'

以下结构对我不起作用:

SELECT regexp_replace('16,16,16,3,3,4,16,16,', '(.+)\1{1,}', '\1');

它返回完全相同的字符串。 :(

谢谢!

【问题讨论】:

  • 你能不能用\\1 代替\1 让我知道它是否有效?
  • 这个改变是否足以解决您的问题?
  • 嗨艾伦,谢谢你的建议。我现在无法访问我的 Redshift 实例,但会尽快尝试并通知您。
  • python udf 可能是一个不错的选择,如果你不能让上述工作
  • 试试SELECT regexp_replace('16,16,16,3,3,4,16,16,', '([0-9]+)(,\1)+', '\1'),或者按照艾伦的建议,加倍反斜杠。如果两者都不起作用,则正则表达式引擎不允许模式中的反向引用。好吧,我认为它不适用于一般情况,请在此处考虑正则表达式以外的选项。

标签: regex amazon-redshift


【解决方案1】:

这是使用 Redshift python UDF 的答案。

create or replace function dedupstring(InputStr varChar)
  returns varchar
stable
as $$
    OutputStr=''
    PrevStr=''
    first=True
    for part in InputStr.split(','):
        if part <> PrevStr:
            if first:
                OutputStr+=part
            else:
                OutputStr+=','+part
            PrevStr=part
            first=False
    return OutputStr
$$ language plpythonu;

Select dedupstring('16,16,16,3,3,4,16,16,');

这将返回 '16,3,4,16,'

【讨论】:

  • 乔恩,我无法测试这个,因为我没有运行 UDF 的权限,但到目前为止它看起来是一个有效且最准确的答案。谢谢!
  • 您不能获得许可吗?见docs.aws.amazon.com/redshift/latest/dg/…
  • 我问了管理员,希望他们能尽快给我访问权限。 ;)
  • 嘿乔恩,“几天”后管理员回复我说他们允许我创建函数。运行测试,一切都很顺利!再次感谢!
【解决方案2】:

给你。 ?

SELECT regexp_replace('16,16,16,3,3,4,16,16,', '([0-9]+,){2}', '$1') ;

 regexp_replace
----------------
 16,3,4,16,

【讨论】:

  • 不确定它是否适用于连续 4 个或其他一些东西 - 尝试 SELECT regexp_replace('16,16,16,16,3,3,4,16,16,', '([ 0-9]+,){2}', '$1') ;它返回 16,16,3,16,16,(使用 UDF 的解决方案适用于这种情况和所有情况)
  • 感谢 Joe 的提示,正如 Jon 所说,它不适用于连续 4 次,但我会更多地考虑这个想法。对此竖起大拇指。
  • 好的 ?‍♂️。我按要求回答了这个问题,但坦率地说,使用数据库对字符串中的数字进行重复数据删除是一个坏主意。这表明存在更深层次的数据质量问题,可能需要在上游解决。我可以从痛苦的经历告诉你,在数据库中“修补”最终会伤害到你。
  • 乔,谢谢你的好建议。这是我们 DS 稍后提出的要求。我们正在格式化和聚合数据作为流程的输入。我按照您所说的做了,而是在上游添加了一个子查询以获得正确的结果。不过,现在对测试 UDF 感到好奇。 ;)
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2015-04-12
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多