SQL Serverで「XYZ123B」や「LM45Z」のような文字列を、「先頭の英字」と「残りの数字+英字」に分割したいことってありませんか?
この記事では、SELECT文だけでスマートに分割する方法と、使っている関数の詳しい解説をお届けします!
🎯 やりたいこと
以下のような文字列を…
| code |
|---|
| XYZ123B |
| LM45Z |
| AB9876X |
| Q9Y |
こんなふうに分割したい!
| code | prefix | rest |
|---|---|---|
| XYZ123B | XYZ | 123B |
| LM45Z | LM | 45Z |
| AB9876X | AB | 9876X |
| Q9Y | Q | 9Y |
🧪 サンプルデータの準備
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でも、ちょっとした工夫で文字列を柔軟に扱えます! PATINDEX と STUFF を組み合わせれば、正規表現っぽい処理もできます。


コメント