使用Redshift表中的REGEXP_REPLACE对字符串重新排序

时间:2017-09-03 06:15:06

标签: sql regex amazon-redshift regexp-replace

我正在尝试使用正则表达式替换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序列,当它出现在字符串的开头,并将它放在最后一个>之前,并保留剩下的字符串。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  • 更新数据库内容,
    UPDATE yourTable SET sequence = ...而不是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')