2017-09-03 53 views
0

我想用正則表達式替換Redshift表中的模式。我一直在努力與REGEXP_RELACE,但迄今沒有成功。在Redshift表中使用REGEXP_REPLACE重新排序字符串

我的數據,與列名sequence和VARCHAR數據類型,看起來像:

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

我想用REGEXP_RELACE(或任何其他功能),在SQL紅移得到以下結果:

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

所以,當它出現在字符串的起始位置時,會找到999序列,並將其最後加上>並保留其餘字符串。

非常感謝您的幫助!

+2

我認爲ÿ您的預期產出的第二行可能有錯字。 –

+0

你是否想讓999跟隨它發現的序列成員(它在你的樣本輸入中總是在最後)或者你想要它在最後(如果999例如在第一序列中找到的話)成員,這不是你的樣本)? – Yunnosch

+0

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Yunnosch

回答

1

如果你只是想查詢可產生這個輸出,則下面應該工作:

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

謝謝,很好的解決方案。 RegExp盡我所能! 而且,是的,這是一個錯字。 –

1

這裏是(基於蒂姆斯)的解決方案,這將額外

  • 更新數據庫內容
    UPDATE yourTable SET sequence = ...代替OD SELECT ... FROM yourTable
  • 找到「999」在任何成員的開始和新行之前所能容忍的空白,使用 沒有$
  • 將其移動到序列的盡頭,
    使用(> [0-9]{7}){0,}第二捕獲組
  • 找到的數字打破了7位規則的任何領導小組,不僅是「999」裏面,
    而不是 「999」,並捕獲它

代碼:

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

太好了。我喜歡你如何尋找超過7位數的任何領先的數字組。 回答上面的問題,是的,'999'只是*期望*在任何序列的最後一個成員。是的,'UPDATE'將會很好。 –