2017-11-14 20 views
0

列内の重複を削除するために、redshiftデータベースにクエリを書く必要があります。Redshift:列データ内の重複を削除する正規表現

select regexp_replace('GiftCard,GiftCard', '([^,]*)(,\2)+($|,)', '\2\3') 

期待される結果:GiftCard

得られた結果:GiftCard,GiftCard

は基本的に、私は繰り返した場合、列の値を検索し、削除します。

誰でも私にこれを助けることができますか?

+1

がしますデータは常に, ??のように見えます。この列のデータは他のどのフォーマットで表示されますか? – hadooper

+0

はい、データは常にstring1、string2、 –

+0

になります。データに(string1、string1)alwaysまたは(string1、string2)(string1、string1)のような列があるかどうかを確認することを意味しました。その中で、重複している値だけを検索し、出力として1つの文字列を取得したいのですか? – hadooper

答えて

0

これは単なる正規表現クエリを使用して行うことはできませんが、Jonが述べたように、UDFはかなりうまく動作します。

テキストをコンマで区切り、ユニークな単語のセットを作成して何らかの形式で戻します。

CREATE FUNCTION f_unique_words (s text) 
    RETURNS text 
IMMUTABLE 
AS $$ 
    return ','.join(set(s.split(','))) 
$$ LANGUAGE plpythonu; 

使用例:

> select f_unique_words('GiftCard,GiftCard'); 
[GiftCard] 
> select f_unique_words('GiftCard,Cat,Dog,Cat,Cat,Frog,frog,GiftCard'); 
[frog,GiftCard,Dog,Frog,Cat] 

それはあなたがクラスタへの適切なアクセス権を持つに依存しない機能は次のようなものになるだろう。関数を作成するには、ユーザーのために 'plpythonu'という言語でUSAGEが許可されていることを確認してください。あなたは小文字で、すべての出力を入れていないこれの大文字小文字を区別しないバージョンをしたい場合、これはどうしたらサイドノートとして

CREATE FUNCTION f_unique_words_ignore_case (s text) 
    RETURNS text 
IMMUTABLE 
AS $$ 
    wordset = set(s.split(',')) 
    return ','.join(item for item in wordset if item.istitle() or item.title() not in wordset) 
$$ LANGUAGE plpythonu; 

使用例:

> select f_unique_words_ignore_case('GiftCard,Cat,Dog,Cat,Cat,Frog,frog,GiftCard'); 
[GiftCard,Dog,Frog,Cat] 
関連する問題