MySQLのLEFT関数の使い方!文字列の左側から一部取得

MySQL

MySQLのLEFT関数について書いています。

LEFT関数は、指定した文字列の左端から指定された文字数分の部分文字列を抽出するために使用されます。
データのクリーニング、レポート作成、または特定の文字列パターンに一致するレコードの検索など、文字列操作において役立ちます。

LEFT関数の基本的な構文

LEFT関数の基本的な構文は以下の通りです。

LEFT(string, length)s
  • string: 部分文字列を抽出したい元の文字列。カラム名、文字列リテラル、または他の関数から返される文字列を指定できます。
  • length: 左端から抽出する文字数を指定する正の整数。

この関数は、stringの左端からlengthで指定された文字数分の部分文字列を返します。

LEFT関数の使用例

いくつか具体的な例を見てみましょう。

例1:基本的な抽出

SELECT LEFT('Hello World', 5);
-- 結果: 'Hello'

この例では、’Hello World’ という文字列の左端から5文字を抽出し、「Hello」が返されます。

例2:カラムからの抽出
products テーブルに product_code カラムがあり、その値が ‘P-XYZ-001’ のような形式だとします。

最初の2文字だけを抽出したい場合:

SELECT product_code, LEFT(product_code, 2) AS product_prefix
FROM products
WHERE product_code = 'P-XYZ-001';
-- 例:'P-XYZ-001' から 'P-' を抽出

例3:日本語(マルチバイト文字)の扱い
MySQLのデフォルトの文字セット(UTF-8など)では、LEFT関数は文字数単位で処理されます。

SELECT LEFT('あいうえお', 3);
-- 結果: 'あいう'

もし文字バイト単位で処理したい場合は、SUBSTRING関数を使用し、文字コードに注意する必要があります。

LEFT関数における文字数指定の注意点

length パラメータに特殊な値を指定した場合の挙動を理解しておくことが重要です。

lengthが文字列の長さより大きい場合

文字列全体の長さより大きい lengthを指定してもエラーにはなりません。
文字列全体が返されます。

SELECT LEFT('Short String', 20);
-- 結果: 'Short String'

lengthが0の場合

空の文字列が返されます。

SELECT LEFT('Hello', 0);
-- 結果: '' (空文字列)

lengthが負の数の場合

空の文字列が返されます。

SELECT LEFT('Hello', -3);
-- 結果: '' (空文字列)

stringがNULLの場合

結果は NULL になります。

SELECT LEFT(NULL, 5);
-- 結果: NULL

LEFT関数と他の文字列関数の組み合わせ

LEFT関数は、他の文字列関数や条件式と組み合わせて、より複雑なデータ操作を行うことができます。

例1:郵便番号の先頭3桁を抽出

customer_address テーブルに postal_code カラム(例: ‘818-0001’)があるとします。

SELECT postal_code, LEFT(postal_code, 3) AS postal_prefix
FROM customer_address;
-- 例: '818-0001' から '818' を抽出

例2:メールアドレスのドメイン名を除外してユーザー名を抽出

usersテーブルにemailカラム(例: ‘user@example.com’)があるとします。
LOCATE関数を使って ‘@’ の位置を見つけ、それより前の部分を抽出します。

SELECT email, LEFT(email, LOCATE('@', email) - 1) AS username
FROM users
WHERE email = 'testuser@example.com';
-- 結果: 'testuser'

例3:特定のプレフィックスを持つデータを更新

product_codes カラムの先頭3文字が ‘NEW’ で始まるレコードを更新したい場合です。

UPDATE inventory
SET status = 'New Arrival'
WHERE LEFT(product_code, 3) = 'NEW';

LEFT関数を使う際の注意点

  • 文字セットと照合順序: MySQLの文字セット(特にUTF-8などのマルチバイト文字セット)と照合順序の設定によって、文字の扱いが異なる場合があります。通常は文字単位で動作しますが、特殊なケースではバイト単位での処理が必要になることもあります。
  • パフォーマンス: 大量のデータに対して WHERE 句の中で LEFT() 関数を使用すると、インデックスが利用できず、パフォーマンスに影響を与える可能性があります。もし頻繁に特定のプレフィックスで検索する場合は、そのプレフィックスを格納する別のカラムを作成し、そこにインデックスを貼ることを検討してください。
  • 代替関数:
    • 文字列の右端から抽出する場合は RIGHT() 関数。
    • 文字列の任意の位置から抽出する場合は SUBSTRING() または SUBSTR() 関数。
    • これらの関数も合わせて使いこなすことで、より柔軟な文字列操作が可能になります。

具体的な使用例

例1:製品コードの管理

products テーブルがあり、item_code カラム(例: ‘BOOK-001’, ‘ELEC-005’)があるとします。
カテゴリを示すプレフィックスを抽出します。

SELECT item_code, LEFT(item_code, 4) AS category_prefix
FROM products;

例2:ログデータの分析

log_entries テーブルに timestamp カラム(例: ‘2025-05-30 10:30:00’)があるとします。
日付部分だけを抽出して、日ごとの集計を行いたい場合。

SELECT LEFT(timestamp, 10) AS log_date, COUNT(*) AS daily_count
FROM log_entries
GROUP BY log_date;

例3:部分的なデータの一意性チェック

ユーザーIDの先頭3文字が重複していないか確認したい場合です。(ただし、これは厳密な一意性チェックではありません)

SELECT LEFT(user_id, 3) AS user_id_prefix, COUNT(*)
FROM users
GROUP BY user_id_prefix
HAVING COUNT(*) > 1;

まとめ

MySQLのLEFT関数は、文字列の左端から指定した長さの部分文字列を簡単に抽出できる強力な関数です。
データの前処理、レポート作成、特定のパターンマッチングなど、多くの場面で活用できます。

lengthパラメータの挙動や、他の文字列関数との組み合わせを理解することで、より効率的かつ正確なデータ操作が可能になります。
パフォーマンスへの影響や、文字セットの考慮も忘れずに行い、SQLクエリを最適化しましょう。

コメント