postgresql-テキストフィールド内の文字列のすべてのインスタンスを置き換えます


213

postgresqlで、データベース列内の文字列のすべてのインスタンスをどのように置き換えるのですか?

たとえば、のすべてのインスタンスをcatで置き換えたいとdogしましょう。

これを行う最良の方法は何ですか?


7
グーグルが失敗する場合は、マニュアルを試してください:postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

回答:


404

postgresqlのreplace関数を使用したい場合:

replace(string text, from text, to text)

例えば ​​:

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

ただし、これは文字列から文字列への置換になるため、「カテゴリ」は「ドゴゴリー」になることに注意してください。regexp_replace関数は、置き換えたいものに対してより厳密な一致パターンを定義するのに役立ちます。


4
こんにちは皆さん、私はあなたの答えと説明が好きです、それは本当に役に立ちます。regexp_replaceを使用して例を追加していただけませんか?ありがとう!
Wim Feijen 2014年

1
より細かくするには、次を使用できますregexp_replace
drs

83

正規表現の方法

より厳密な置換マッチングが必要な場合、PostgreSQLのregexp_replace関数はPOSIX正規表現パターンを使用してマッチングできます。構文はregexp_replace(source、pattern、replacement [、flags])です。

フラグを使用ig、大文字と小文字を区別しないグローバルマッチングをそれぞれ使用します。また、\mand \Mを使用して、それぞれ単語の最初と最後を一致させます。

正規表現の置換を実行する場合、通常、かなりの数の問題があります。に置き換えるのがいかに簡単か見てみましょう。

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

それでも、少なくとも 1つの未解決の状態があります。たとえば、「Cat」で始まる文は、小文字の「dog」に置き換えられ、文の大文字化が解除されます。

詳細については、現在のPostgreSQL パターンマッチングドキュメントをご覧ください。

置換テキストで列全体を更新する

私の例では、おそらく最も安全なオプションは次のとおりです。

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

30

あなたはreplace関数を使うことができます

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

関数の定義は次のとおりです(ここから取得)。

replace(string text, from text, to text)

変更されたテキストを返します。このSQLフィドルをチェックすることもできます。


0

正規表現を使用して、列内の1つ以上の空白文字のすべてのインスタンスをアンダースコアに置き換える例を次に示します-

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

「s」が必要になる前のバックスラッシュは1つだけだと思います
Marty Neal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.