PostgreSQL 置換文字列

Joy Idialu 2023年1月30日
  1. PostgreSQL の replace() 関数を使用して文字列を置き換える
  2. PostgreSQL の regexp_replace() 関数を使用して文字列を置き換える
  3. その他の PostgreSQL replace() 関数の例
PostgreSQL 置換文字列

このチュートリアルでは、PostgreSQL の replace() 関数を使用して文字列を置き換える方法について説明します。

PostgreSQL の replace() 関数を使用して文字列を置き換える

PostgreSQL の replace() 関数には、すべてタイプテキストである次のパラメーターがあります。

replace (string text, from text, to text)

string パラメータは、replace() 関数が実行されるソーステキストです。from パラメータは string 引数のサブストリングであり、変更される部分を表します。

to パラメータは、from 引数が変更される string 引数のサブストリングを表します。

たとえば、次に示すように、replace() 関数を使用して Catfish という単語を Turtle に変更してみましょう。

SELECT replace ('Catfish', 'Catfish', 'Turtle');

結果は次のとおりです。

 replace
---------
 Turtle

次に示すように、Catfish のサブストリング CatJelly に置き換えましょう。

SELECT replace('Catfish', 'Cat', 'Jelly');

結果は次のとおりです。

  replace
-----------
 Jellyfish

この関数は、文字列内の特殊文字を置き換えるためにも使用できます。たとえば、次に示すように、空白スペースをコンマに置き換えます。

SELECT replace('A B C D E', ' ', ',');

結果は次のとおりです。

  replace
-----------
 A,B,C,D,E

ランダムな文字のテキストがあり、文字 a が大文字であるか小文字であるかに関係なく、文字 a のすべての出現箇所を b に置き換えたいとします。ここに示すように、このコマンドを実行すると、次のようになります。

SELECT replace('agAdavA', 'a', 'b');

結果は次のとおりです。

 replace
---------
 bgAdbvA

上記の結果は、小文字の a の出現のみが置き換えられたため、大文字と小文字の両方の a のすべての出現を b に置き換える要件を満たしていません。したがって、PostgreSQL の regexp_replace() 関数を導入する必要があります。

PostgreSQL の regexp_replace() 関数を使用して文字列を置き換える

PostgreSQL の regexp_replace() 関数には、すべてタイプテキストである次のパラメーターがあります。

regexp_replace (string text, pattern text, replacement text [,flags text])

string 引数は、置換機能が実行されるソース文字列です。pattern パラメータは、文字列引数の部分文字列を置き換える前に一致する必要がある正規表現を表します。

replacement パラメータは、文字列引数のサブ文字列を変更するテキストを表します。flags パラメーターは、regexp_replace() 関数の動作を変更するために使用できるテキストを表します。

前の例では、a のすべての大文字と小文字を b に変更する必要がありましたが、次に示すように、regexp_replace() 関数を使用できます。

SELECT regexp_replace('agAdavA', '[a | A]+', 'b', 'g');

結果は次のとおりです。

 regexp_replace
----------------
 bgbdbvb

正規表現の導入により、大文字と小文字の a のすべての出現箇所が必要に応じて置き換えられました。g フラグは、a の最初の出現だけでなく、すべての出現が置き換えられることを保証します。

パターンマッチングに関する PostgreSQL のドキュメントは次のとおりです。

その他の PostgreSQL replace() 関数の例

次に示すように、単一の単語で構成される text という名前の列を持つテーブルがあるとします。

id text
1 Red
2 Green
3 Blue
4 Red
5 Red

そして、Red という単語のすべての出現箇所を Yellow に置き換えたいと思います。次に示すように、replace() 関数を使用できます。

UPDATE demo SET text = replace(text, 'Red', 'Yellow');

結果は次のとおりです。

 id |  text
----+--------
  1 | Yellow
  2 | Green
  3 | Blue
  4 | Yellow
  5 | Yellow

同じテーブルで、次のように、テキストフィールドに特殊文字を含む単語があるとします。

id text
6 g-r-e-e-n
7 1-23–4
8 one-and-two
9 —n—2—
10 —–

また、ハイフン(-)のすべての出現箇所をアンダースコア(_)に置き換えます。次に示すように、replace() 関数はそれを実現できます。

UPDATE demo SET text = replace(text, '-', '_');

結果は次のとおりです。

 id |    text
----+-------------
  6 | g_r_e_e_n
  7 | 1_23__4
  8 | one_and_two
  9 | ___n___2___
 10 | _____

次に示すように、text フィールドに 1つの単語ではなく文が含まれるように、さらにレコードをテーブルに挿入すると、次のようになります。

id text
11 She bought a red bag
12 Green is a good color
13 The sky is blue
14 The color of the shirt is red
15 They plan to go with blue or red balloons

そして、red という単語を yellow に置き換えたいと思います。これは、次に示すように、replace() 関数を使用して実現できます。

UPDATE demo SET text = replace(text, 'red', 'yellow');

結果は次のとおりです。

 id |                     text
----+----------------------------------------------
 11 | She bought a yellow bag
 12 | Green is a good color
 13 | The sky is blue
 14 | The color of the shirt is yellow
 15 | They plan to go with blue or yellow balloons

従うために、実行するコマンドは次のとおりです。

--CREATE statement
CREATE TABLE demo (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  text TEXT NOT NULL
);

--insert first set of records
INSERT INTO demo (text)
VALUES
  ('Red'),
  ('Green'),
  ('Blue'),
  ('Red'),
  ('Red');

--insert second set of records
INSERT INTO demo (text)
VALUES
  ('g-r-e-e-n'),
  ('1-23--4'),
  ('one-and-two'),
  ('---n---2---'),
  ('-----');

--insert third and final set of records
INSERT INTO demo (text)
VALUES
  ('She bought a red bag'),
  ('Green is a good color'),
  ('The sky is blue'),
  ('The color of the shirt is red'),
  ('They plan to go with blue or red balloons');

--update statements that include the REPLACE function
UPDATE demo SET text = replace(text, 'Red', 'Yellow');
UPDATE demo SET text = replace(text, '-', '_');
UPDATE demo SET text = replace(text, 'red', 'yellow');

--view all the changes
SELECT * FROM demo;

このチュートリアルでは、PostgreSQL の replace() および regexp_replace 関数を使用して文字列を置き換える方法と、replace() 関数を使用してテーブル内の文字列を更新する方法について説明しました。

関連記事 - PostgreSQL String