SQLでゼロ埋めする方法|数値やIDを指定桁数に整えるLPAD関数の使い方

データベース・SQL

「社員IDを統一した桁数で表示したい」「注文番号を見やすく整形したい」「帳票の出力を綺麗に揃えたい」

そんなときに活躍するのが、SQLでのゼロ埋め(ゼロパディング)です。

数値の前にゼロを付けて指定した桁数に揃えることで、データの見た目を統一できます。

この記事では、SQL初心者の方でも理解できるよう、ゼロ埋めの基本からデータベース別の実装方法まで、具体例を交えながらわかりやすく解説します。

スポンサーリンク

ゼロ埋めとは

基本的な概念

ゼロ埋め(ゼロパディング)とは、数値の前にゼロを付けて指定した桁数に揃える処理のことです。

主に見た目を統一したり、データの並び順を整えたりする目的で使用されます。

ゼロ埋めの例

変換前と変換後の比較

元の値5桁でゼロ埋め後用途例
100001社員ID
2300023商品コード
45600456注文番号
789007890顧客番号
1234512345そのまま(既に5桁)

なぜゼロ埋めが必要なの?

見た目の統一

  • 帳票や画面表示で桁数がバラバラだと見づらい
  • ファイル名やコードの形式を統一できる
  • 印刷物の体裁を整えられる

データの並び順

  • 文字列として比較する際の順序が正しくなる
  • ファイルのソート順が数値順と一致する

外部システム連携

  • 他システムが固定長のIDを要求する場合
  • CSVファイルやテキストファイルの出力時

基本的なゼロ埋め方法

LPAD関数を使った方法

多くのデータベースシステムでは、LPAD関数でゼロ埋めを実現できます。

基本構文

LPAD(対象の値, 桁数, '埋める文字')

パラメータの説明

  • 対象の値:ゼロ埋めしたい数値や文字列
  • 桁数:最終的に何桁にするか
  • 埋める文字:不足分を埋める文字(通常は’0’)

基本的な使用例

まず、サンプルデータを用意しましょう。

employees テーブル

CREATE TABLE employees (
    emp_id INT,
    name VARCHAR(50),
    department VARCHAR(30)
);

INSERT INTO employees VALUES
    (1, '田中太郎', '営業部'),
    (23, '山田花子', '開発部'),
    (456, '佐藤次郎', '総務部'),
    (7890, '鈴木三郎', '経理部'),
    (12345, '高橋四郎', '人事部');

基本的なゼロ埋めクエリ

SELECT
    emp_id AS 元のID,
    LPAD(emp_id, 5, '0') AS ゼロ埋めID,
    name AS 名前
FROM employees
ORDER BY emp_id;

実行結果

元のIDゼロ埋めID名前
100001田中太郎
2300023山田花子
45600456佐藤次郎
789007890鈴木三郎
1234512345高橋四郎

データベース別の実装方法

MySQL

MySQLではLPAD関数が標準で使用できます。

基本的な使い方

-- 5桁でゼロ埋め
SELECT LPAD(emp_id, 5, '0') AS formatted_id
FROM employees;

-- 8桁でゼロ埋め
SELECT LPAD(emp_id, 8, '0') AS formatted_id
FROM employees;

実用例:商品コードの生成

-- 商品カテゴリ + ゼロ埋めID
SELECT
    product_id,
    category,
    CONCAT(category, '-', LPAD(product_id, 4, '0')) AS product_code
FROM products;

PostgreSQL

PostgreSQLもLPAD関数をサポートしています。

基本的な使い方

SELECT LPAD(emp_id::TEXT, 5, '0') AS formatted_id
FROM employees;

注意点 PostgreSQLでは数値を文字列に明示的に変換する必要があります(::TEXTまたはCASTを使用)。

複数の変換方法

-- 方法1: ::TEXT
SELECT LPAD(emp_id::TEXT, 5, '0') AS formatted_id
FROM employees;

-- 方法2: CAST関数
SELECT LPAD(CAST(emp_id AS TEXT), 5, '0') AS formatted_id
FROM employees;

-- 方法3: TO_CHAR関数(PostgreSQL特有)
SELECT TO_CHAR(emp_id, 'FM00000') AS formatted_id
FROM employees;

Oracle

OracleでもLPAD関数が利用できます。

基本的な使い方

SELECT LPAD(emp_id, 5, '0') AS formatted_id
FROM employees;

Oracle特有の方法:TO_CHAR関数

-- フォーマット指定による方法
SELECT TO_CHAR(emp_id, '00000') AS formatted_id
FROM employees;

SQLite

SQLiteにはLPAD関数がないため、文字列操作で代用します。

方法1:文字列結合とSUBSTR関数

SELECT SUBSTR('00000' || emp_id, -5) AS formatted_id
FROM employees;

方法2:PRINTF関数(SQLite 3.8.3以降)

SELECT PRINTF('%05d', emp_id) AS formatted_id
FROM employees;

SQLiteの実装例

-- サンプルデータ
CREATE TABLE test_data (
    id INTEGER,
    value INTEGER
);

INSERT INTO test_data VALUES
    (1, 7),
    (2, 89),
    (3, 234),
    (4, 5678);

-- 方法1: 文字列結合
SELECT
    value,
    SUBSTR('00000' || value, -5) AS zero_padded_substr
FROM test_data;

-- 方法2: PRINTF関数
SELECT
    value,
    PRINTF('%05d', value) AS zero_padded_printf
FROM test_data;

実行結果

valuezero_padded_substrzero_padded_printf
70000700007
890008900089
2340023400234
56780567805678

SQL Server

SQL Serverでは複数の方法でゼロ埋めを実現できます。

方法1:RIGHT関数とREPLICATE関数

SELECT RIGHT(REPLICATE('0', 5) + CAST(emp_id AS VARCHAR), 5) AS formatted_id
FROM employees;

方法2:FORMAT関数(SQL Server 2012以降)

SELECT FORMAT(emp_id, '00000') AS formatted_id
FROM employees;

実践的な活用例

例1:注文コードの生成

注文データから、見やすい注文コードを生成してみましょう。

orders テーブル

CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    order_date DATE,
    total_amount DECIMAL(10,2)
);

INSERT INTO orders VALUES
    (1, 1001, '2025-01-15', 12500.00),
    (45, 2003, '2025-01-16', 8750.50),
    (123, 1007, '2025-01-17', 25300.00),
    (1567, 3012, '2025-01-18', 156780.75);

注文コード生成クエリ

SELECT
    order_id,
    'ORD-' || LPAD(order_id, 6, '0') AS order_code,
    customer_id,
    LPAD(customer_id, 4, '0') AS customer_code,
    total_amount
FROM orders
ORDER BY order_id;

実行結果

order_idorder_codecustomer_idcustomer_codetotal_amount
1ORD-0000011001100112500.00
45ORD-000045200320038750.50
123ORD-0001231007100725300.00
1567ORD-00156730123012156780.75

例2:ファイル名の生成

バックアップファイルやエクスポートファイルの命名に活用できます。

SELECT
    table_name,
    'backup_' || table_name || '_' || 
    LPAD(backup_number, 3, '0') || '.sql' AS backup_filename
FROM backup_log
ORDER BY backup_number;

例3:レポート番号の自動生成

月次レポートや年次レポートの番号生成に使用できます。

-- 年月とシーケンス番号を組み合わせたレポートID
SELECT
    report_id,
    EXTRACT(YEAR FROM created_date) AS year,
    EXTRACT(MONTH FROM created_date) AS month,
    CONCAT(
        EXTRACT(YEAR FROM created_date),
        LPAD(EXTRACT(MONTH FROM created_date), 2, '0'),
        '-',
        LPAD(report_id, 4, '0')
    ) AS formatted_report_id
FROM monthly_reports
ORDER BY created_date;

例4:商品JAN コードの整形

既存の商品コードを標準的なJANコード形式に整形する例です。

-- 13桁のJANコード形式に整形
SELECT
    product_id,
    product_name,
    jan_code_base,
    CASE
        WHEN LENGTH(jan_code_base) <= 13 THEN
            LPAD(jan_code_base, 13, '0')
        ELSE
            jan_code_base
    END AS formatted_jan_code
FROM products
WHERE jan_code_base IS NOT NULL;

日付・時刻のゼロ埋め

日付や時刻の表示でもゼロ埋めは重要です。

月日のゼロ埋め

-- 日付を YYYY-MM-DD 形式で表示
SELECT
    order_date,
    CONCAT(
        EXTRACT(YEAR FROM order_date),
        '-',
        LPAD(EXTRACT(MONTH FROM order_date), 2, '0'),
        '-',
        LPAD(EXTRACT(DAY FROM order_date), 2, '0')
    ) AS formatted_date
FROM orders;

時刻のゼロ埋め

-- 時刻を HH:MM:SS 形式で表示
SELECT
    created_timestamp,
    CONCAT(
        LPAD(EXTRACT(HOUR FROM created_timestamp), 2, '0'),
        ':',
        LPAD(EXTRACT(MINUTE FROM created_timestamp), 2, '0'),
        ':',
        LPAD(EXTRACT(SECOND FROM created_timestamp), 2, '0')
    ) AS formatted_time
FROM transaction_log;

ゼロ埋めを使う際の注意点

データ型の変換

ゼロ埋め処理では、数値が文字列に変換されることに注意が必要です。

注意すべき例

-- 数値として処理したい場合
SELECT emp_id + 1000 AS calculated_id  -- 数値計算
FROM employees;

-- ゼロ埋め後は文字列になる
SELECT LPAD(emp_id, 5, '0') + 1000 AS calculated_id  -- エラーまたは予期しない結果
FROM employees;

対処法

-- 計算後にゼロ埋めする
SELECT LPAD(emp_id + 1000, 5, '0') AS calculated_id
FROM employees;

-- または、ゼロ埋めした値を別の列として扱う
SELECT
    emp_id,
    emp_id + 1000 AS calculated_id,
    LPAD(emp_id, 5, '0') AS formatted_id
FROM employees;

桁数の設定

指定した桁数よりも大きな値の場合の動作を理解しておきましょう。

-- 5桁指定だが、元の値が6桁の場合
SELECT LPAD(123456, 5, '0') AS result;
-- 結果: 123456 (そのまま表示、切り捨てされない)

パフォーマンスへの影響

大量のデータに対してゼロ埋め処理を行う場合は、パフォーマンスに注意が必要です。

改善のコツ

-- インデックスを活用できるよう、WHERE句は元の値で指定
SELECT LPAD(emp_id, 5, '0') AS formatted_id
FROM employees
WHERE emp_id BETWEEN 1 AND 1000  -- ゼロ埋め前の値で条件指定
ORDER BY emp_id;  -- ゼロ埋め前の値でソート

応用テクニック

可変長のゼロ埋め

データによって桁数を変える場合の処理です。

-- カテゴリによって桁数を変更
SELECT
    product_id,
    category,
    CASE category
        WHEN 'electronics' THEN LPAD(product_id, 8, '0')
        WHEN 'clothing' THEN LPAD(product_id, 6, '0')
        ELSE LPAD(product_id, 5, '0')
    END AS formatted_product_id
FROM products;

複数の値を組み合わせたコード生成

-- 部署コード + 年度 + ゼロ埋め連番
SELECT
    emp_id,
    department_code,
    hire_year,
    CONCAT(
        department_code,
        RIGHT(hire_year, 2),
        LPAD(emp_id, 4, '0')
    ) AS employee_code
FROM employees;

条件付きゼロ埋め

NULLや特定の条件の場合のみゼロ埋めを適用する処理です。

SELECT
    emp_id,
    name,
    CASE
        WHEN emp_id IS NOT NULL THEN LPAD(emp_id, 5, '0')
        ELSE 'NO-ID'
    END AS formatted_id
FROM employees;

まとめ

SQLでのゼロ埋めは、データの見た目を整えるための重要なテクニックです。

基本的な理解

  • ゼロ埋めは数値の前にゼロを付けて桁数を揃える処理
  • 主に見た目の統一や外部システム連携で使用
  • LPAD関数が最も一般的な実装方法

データベース別の対応

  • MySQL、PostgreSQL、Oracle:LPAD関数
  • SQLite:SUBSTR関数やPRINTF関数で代用
  • SQL Server:FORMAT関数やREPLICATE関数

実践的な活用

  • 注文コードや商品コードの生成
  • ファイル名の統一
  • 日付時刻の表示整形
  • レポート番号の自動生成

注意すべきポイント

  • 数値から文字列への型変換
  • 指定桁数を超える値の扱い
  • パフォーマンスへの配慮
  • NULL値の処理

コメント

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