スポンサーリンク
SQL Server

SQL Serverで文字列を英字と数字に分割する方法(例:XYZ123B → XYZ / 123B)

SQL Server
この記事は約3分で読めます。

SQL Serverで「XYZ123B」や「LM45Z」のような文字列を、「先頭の英字」と「残りの数字+英字」に分割したいことってありませんか?

この記事では、SELECT文だけでスマートに分割する方法と、使っている関数の詳しい解説をお届けします!

🎯 やりたいこと

以下のような文字列を…

code
XYZ123B
LM45Z
AB9876X
Q9Y

こんなふうに分割したい!

codeprefixrest
XYZ123BXYZ123B
LM45ZLM45Z
AB9876XAB9876X
Q9YQ9Y

🧪 サンプルデータの準備

CREATE TABLE your_table (
    code VARCHAR(50)
);

INSERT INTO your_table (code) VALUES
('XYZ123B'),
('LM45Z'),
('AB9876X'),
('Q9Y');

🛠️ 分割SQL

SELECT
  code,
  LEFT(code, PATINDEX('%[^A-Z]%', code) - 1) AS prefix,
  STUFF(code, 1, PATINDEX('%[^A-Z]%', code) - 1, '') AS rest
FROM your_table;

🔍 関数の解説

🧩 PATINDEX

PATINDEX は、特定のパターンが文字列の中で最初に現れる位置を返す関数です。

PATINDEX('%[^A-Z]%', code)
  • %:任意の文字列
  • [^A-Z]大文字アルファベット以外の最初の文字
  • つまり、「最初に数字や記号が出てくる位置」を探します!

🧪 例:

SELECT PATINDEX('%[^A-Z]%', 'XYZ123B'); -- 結果: 4

🧰 STUFF

STUFF は、文字列の一部を削除して、別の文字列を挿入する関数です。

STUFF(code, 1, 長さ, '')
  • code:対象の文字列
  • 1:削除を始める位置(ここでは先頭)
  • 長さ:削除する文字数(ここでは先頭の英字の長さ)
  • '':挿入する文字列(今回は削除だけしたいので空文字)

🧪 例:

SELECT STUFF('XYZ123B', 1, 3, ''); -- 結果: '123B'

✅ 実行結果

-- 実行結果
code     | prefix | rest
---------|--------|-------
XYZ123B  | XYZ    | 123B
LM45Z    | LM     | 45Z
AB9876X  | AB     | 9876X
Q9Y      | Q      | 9Y

💡 応用アイデア

  • UPDATE文に組み込んで、分割結果を別カラムに保存
  • WHERE句で「数字が含まれるコードだけ抽出」などの条件分岐
  • CHARINDEX, SUBSTRING, REPLACE などと組み合わせてさらに柔軟な加工も可能!

🧼 おわりに

SQL Serverでも、ちょっとした工夫で文字列を柔軟に扱えます! PATINDEXSTUFF を組み合わせれば、正規表現っぽい処理もできます。

コメント

タイトルとURLをコピーしました