SUBSTRING、REPLACE、PATINDEXを使いこなす!SQL Serverで文字列を自在に操る

2024-04-02

SQL Serverで文字列の一部を更新・置換する方法

本記事では、以下の3つの方法について解説します。

  1. SUBSTRINGLEN 関数
  2. REPLACE 関数
  3. PATINDEXUPDATE 関数

それぞれの方法について、具体的なコード例と詳細な説明を提供します。

前提条件

以下の環境を想定しています。

  • SQL Server 2017以降
  • サンプルデータベース AdventureWorks2019

SUBSTRING と LEN 関数

SUBSTRING 関数は、文字列から指定された部分文字列を取得します。LEN 関数は、文字列の長さを取得します。これらの関数を組み合わせることで、文字列の一部を更新・置換することができます。

例:

Products テーブルの Name 列に、"自転車" という文字列が含まれるすべての製品名を "電動自転車" に更新します。

UPDATE Products
SET Name = SUBSTRING(Name, 1, LEN(Name) - 2) + '電動自転車'
WHERE Name LIKE '%自転車%';

解説:

  • SUBSTRING(Name, 1, LEN(Name) - 2)Name 列の最初の文字から、最後の2文字を除いた部分文字列を取得します。
  • + '電動自転車':取得した部分文字列に "電動自転車" を連結します。
  • WHERE Name LIKE '%自転車%'Name 列に "自転車" という文字列が含まれる製品のみを更新します。

REPLACE 関数は、文字列中の指定された文字列を別の文字列に置換します。

Customers テーブルの ContactTitle 列に、"Mr." という文字列を "Ms." に置換します。

UPDATE Customers
SET ContactTitle = REPLACE(ContactTitle, 'Mr.', 'Ms.');
  • REPLACE(ContactTitle, 'Mr.', 'Ms.')ContactTitle 列の "Mr." という文字列を "Ms." に置換します。

PATINDEX と UPDATE 関数

PATINDEX 関数は、文字列パターンに一致する最初の位置を返します。

Employees テーブルの FirstName 列に、数字が含まれるすべての名前の先頭に "数字" という文字列を追加します。

UPDATE Employees
SET FirstName = '数字' + FirstName
WHERE PATINDEX('[0-9]', FirstName) > 0;
  • PATINDEX('[0-9]', FirstName) > 0FirstName 列に数字が含まれる場合、PATINDEX 関数は 0 より大きい値を返します。
  • '数字' + FirstName:名前の先頭に "数字" という文字列を追加します。

上記3つの方法を使い分けることで、様々なパターンで文字列の一部を更新・置換することができます。

補足

  • 上記の例は基本的な方法を紹介していますが、より複雑な置換処理を行う場合は、CASE 式やその他の関数を利用することもできます。
  • 更新処理を実行する前に、必ずバックアップを取ることを忘れないでください。



SUBSTRING と LEN 関数

-- サンプルデータベース AdventureWorks2019 を使用する
USE AdventureWorks2019;

-- Products テーブルの Name 列に "自転車" という文字列が含まれる
-- すべての製品名を "電動自転車" に更新
UPDATE Products
SET Name = SUBSTRING(Name, 1, LEN(Name) - 2) + '電動自転車'
WHERE Name LIKE '%自転車%';

-- 更新結果を確認
SELECT Name
FROM Products
WHERE Name LIKE '%電動自転車%';

REPLACE 関数

-- サンプルデータベース AdventureWorks2019 を使用する
USE AdventureWorks2019;

-- Customers テーブルの ContactTitle 列に "Mr." という文字列を
-- "Ms." に置換
UPDATE Customers
SET ContactTitle = REPLACE(ContactTitle, 'Mr.', 'Ms.');

-- 更新結果を確認
SELECT ContactTitle
FROM Customers
WHERE ContactTitle = 'Ms.';

PATINDEX と UPDATE 関数

-- サンプルデータベース AdventureWorks2019 を使用する
USE AdventureWorks2019;

-- Employees テーブルの FirstName 列に数字が含まれる
-- すべての名前の先頭に "数字" という文字列を追加
UPDATE Employees
SET FirstName = '数字' + FirstName
WHERE PATINDEX('[0-9]', FirstName) > 0;

-- 更新結果を確認
SELECT FirstName
FROM Employees
WHERE FirstName LIKE '数字%';

実行方法

  1. SQL Server Management Studio (SSMS) を起動します。
  2. サンプルコードをコピーして、SSMS のクエリ エディターに貼り付けます。
  3. クエリ エディター ツールバーの [実行] ボタンをクリックします。
  4. 結果ペインで、更新結果を確認します。



その他の文字列更新・置換方法

Products テーブルの Description 列に、"**" という文字列を商品名の後に挿入します。

UPDATE Products
SET Description = STUFF(Description, LEN(Name) + 2, 0, ' **');
  • STUFF(Description, LEN(Name) + 2, 0, ' **')
    • Description 列に
    • 商品名の長さ (LEN(Name)) + 2 番目
    • 0 文字挿入
    • " **" を挿入

Customers テーブルの Email 列に、"@example.com" という文字列が含まれるすべてのメールアドレスの先頭に "sales." を追加します。

UPDATE Customers
SET Email = 'sales.' + Email
WHERE CHARINDEX('@example.com', Email) > 0;
  • CHARINDEX('@example.com', Email) > 0Email 列に "@example.com" という文字列が含まれる場合、CHARINDEX 関数は 0 より大きい値を返します。
  • 'sales.' + Email:メールアドレスの先頭に "sales." という文字列を追加します。

正規表現と UPDATE 関数

SQL Server 2016 以降では、正規表現を使用して文字列を更新・置換することができます。

UPDATE Employees
SET LastName = REPLACE(LastName, '^([0-9]+).*', '数字\1');
  • REPLACE(LastName, '^([0-9]+).*', '数字\1')
    • LastName 列を
    • 正規表現 ^([0-9]+).* で置換
    • \1 は最初のキャプチャグループの内容

上記以外にも、様々な方法があります。

最適な方法を選択するには、以下の点を考慮する必要があります。

  • 更新対象となる文字列のパターン
  • 置換処理の複雑さ
  • パフォーマンス

いくつかの方法を試してみて、要件に合致する最適な方法を選択してください。


sql sql-server string


【SQLエラー徹底解説】ORA-00979「not a GROUP BY expression」の原因と解決策

ORA-00979 は、Oracleデータベースで発生するSQLエラーです。このエラーは、SELECT句で選択された列とGROUP BY句で指定された列に不一致がある場合に発生します。原因このエラーが発生する主な原因は2つあります。GROUP BY句に含まれていない列がSELECT句に選択されている例:SELECT 部門名...


DATE_TRUNC関数で月初日を取得する方法

DATE_TRUNC関数は、日付型を指定した精度で切り捨ててくれる関数です。月初日を取得するには、以下のようにDATE_TRUNC関数と'month'を組み合わせて使用します。EXTRACT関数は、日付型から指定した部分(年、月、日など)を抽出する関数です。月初日を取得するには、以下のようにEXTRACT関数とYEAR、MONTHを組み合わせて使用します。...


MySQLでブール型フィールドのパフォーマンスを向上させる方法:インデックス、パーティショニング、集計テーブル、マテリアライズドビュー

MySQLデータベースでブール型フィールドにインデックスを作成するかどうかは、パフォーマンスとストレージのトレードオフを伴う複雑な問題です。適切な判断を行うためには、データの特性、クエリのワークロード、およびデータベースサーバーの全体的なパフォーマンスを考慮する必要があります。...


MariaDBでREGEXP_REPLACEとLIKEを組み合わせる:詳細解説とサンプルコード

LIKEステートメントは、データベース内のデータとパターンの一致に基づいて検索を行う際に用いられます。しかし、単純なパターンマッチングでは十分でないケースも存在します。そこで、正規表現を用いたより高度なパターンマッチングを実現するために、REGEXP_REPLACE関数とLIKEステートメントを組み合わせることが有効となります。...


SQL SQL SQL SQL Amazon で見る



REPLACE 関数はもう古い?SQL Server でスマートなテキスト置換を実現する代替方法

STRING_AGG 関数と SUBSTRING 関数この方法は、複雑な置換パターンや複数回の置換に適しています。長所:複雑な置換パターンに対応可能複数回の置換が可能REPLACE 関数よりも処理速度が遅い場合がある可読性が低いCASE 式