【问题标题】:Reorder a string using REGEXP_REPLACE in a Redshift table在 Redshift 表中使用 REGEXP_REPLACE 重新排序字符串
【发布时间】:2018-02-11 17:36:09
【问题描述】:

我正在尝试使用正则表达式替换 Redshift 表中的模式。我一直在尝试REGEXP_RELACE,但到目前为止没有成功。

我的数据,列名为 sequence 和 varchar 数据类型,如下所示:

1420311 > 1380566 > 1380566 > 9991380564  
1489773 > 9991489773  
1367309 > 1367309 > 9991367309

我想在 SQL Redshift 中使用REGEXP_RELACE(或任何其他函数)来获得以下结果:

1420311 > 1380566 > 1380566 > 1380564 > 999
1489773 > 1489773 > 999
1367309 > 1367309 > 1367309 > 999

也就是说,当 999 序列出现在字符串的开头时,将其放在最后一个 > 前面并保留剩余的字符串。

非常感谢任何帮助!

【问题讨论】:

  • 我认为您的预期输出的第二行可能有错字。
  • 您希望 999 跟随它所在的序列成员(在您的示例输入中恰好总是在末尾)还是希望它在最后(如果 999 是例如,在第一个序列成员中发现,这不在您的样本中)?
  • 您想要显示结果的查询还是要更新数据库内容? (好问题,@TimBiegeleisen。)

标签: sql regex amazon-redshift regexp-replace


【解决方案1】:

这是一个解决方案(基于 Tims),它会另外

  • 更新数据库内容,
    UPDATE yourTable SET sequence = ... 代替 od SELECT ... FROM yourTable
  • 在任何成员的开头找到“999”并在换行符之前允许空格,
    没有$
  • 将它移到序列的最后,
    在第二个捕获组中使用( > [0-9]{7}){0,}
  • 找出任何违反 7digit 规则的前导数字组,不仅是“999”,
    使用 ([0-9]{1,}) 而不是 "999" 并捕获它

代码:

UPDATE yourTable SET sequence =
    REGEXP_REPLACE(sequence, '([0-9]{1,})([0-9]{7}( > [0-9]{7}){0,})', '$2 > $1')

【讨论】:

  • 太棒了。我喜欢你如何寻找任何超过 7 位数字的领先数字组。回答您上面的问题,是的,'999' 仅在任何序列的最后一个成员中预期。是的,UPDATE 会很好。
【解决方案2】:

如果您只想要一个可以生成此输出的查询,那么以下应该可以工作:

SELECT
    REGEXP_REPLACE(sequence, '999([0-9]{7})$', '$1 > 999')
FROM yourTable

【讨论】:

  • 谢谢,很好的解决方案。正则表达式做我的头!而且,是的,这是一个错字。
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多