Navicatブログ

SQLで検索と置換を実行する方法 2023年1月18日 Robert Gravelle

ご存じのとおり、データベース内のテキスト値を更新することはよくあることです。それにもかかわらず、本番テーブルに対してバッチ更新を実行する際に何の不安も感じないデータベース管理者(DBA)はまれです。今日のブログでは、テーブル列の全体的にまたは部分に文字列を置き換えるためにSQL REPLACE()関数を使用する方法を学びます。

典型的なシナリオ

これは、classicmodelsサンプルデータベースのproductsテーブルのスクリーンショットです:

products_table (114K)

Chef Anton製品のメーカーが彼らの製品を引用符("")で囲むことを決定したとします。これには、合計4つの手順が必要です:

  1. LIKE演算子を使用して、Chef Anton製品を含む行を識別します。
  2. 製品名を解析します。
  3. 囲む引用符を追加します。
  4. SELECT QUERYをUPDATEに変換します。

各手順を見ていきましょう。

Chef Anton製品を含む行を識別する

前述のように、LIKE 演算子を使用して、Chef Anton製品を含む行を識別することができます。これらはそれぞれ“Chef Anton's”という文字列で始まるため、それを検索できます。それを行うためには、一重引用符(')文字をエスケープし、複数文字の"%"ワイルドカードを含める必要があります。Navicat Premium 16での結果クエリと結果は次のとおりです:

like_query (49K)

製品名を解析する

次の手順は、製品名を解析して、それを引用符で囲むことができるようにすることです。これを行うためには、LEN()関数を使用して、文字列の“Chef Anton's”部分の後の文字数を計算し、その結果をRIGHT()関数に渡します:

select_right_query (55K)

囲む引用符を追加する

SELECTクエリを作成する最後の手順は、製品名を引用符で囲むことです。製品名を解析したら、それをREPLACE()関数の最初のパラメータとして、連結された(引用符で囲まれた)バージョンを2番目のパラメータとして提供します:

replace_query (68K)

同じ目的を達成する別の方法は、単純にCONCAT()関数を使用して、次のように文字列の各部分をフィードすることです:

SELECT CONCAT(
         LEFT(ProductName, LENGTH('Chef Anton\'s ')),
			 	 '"',
				 RIGHT(ProductName, LENGTH(ProductName)-LENGTH('Chef Anton\'s ')), 
				 '"'
       ) AS product_name 
FROM products 
WHERE ProductName LIKE 'Chef Anton\'s %'; 

SELECT QUERYをUPDATEに変換する

あとは、SELECTクエリをUPDATEに変換するだけです。最初にクエリをSELECTとして実行したので、UPDATEステートメントが関心のある行以外の行に影響を与えないことを確信できます。UPDATEクエリと、2行だけが更新されたことを確認する結果を次に示します:

update_query (60K)

productsテーブルをリフレッシュすると、更新された値が表示されます:

updated_products_table (39K)

SQLで検索と置換を実行する方法に関する最終的な考え

このブログでは、4つの手順を使用してテーブル列の文字列を更新する方法を学びました。クエリを一連のSELECTステートメントとして構築することにより、意図しないデータを誤って変更するリスクを最小限に抑えることができます。

ブログのアーカイブ
シェア