PostgreSQLで数値や文字列を0埋め(ゼロパディング)する方法について、使い方と具体例をわかりやすく解説します。
0埋め(ゼロパディング)とは?

0埋めとは、数値や文字列の前に0を追加して、指定した桁数にそろえる操作のことです。
0埋めの例
- 数字「7」を「007」にする
- 文字列「ABC」を「000ABC」にする
- 商品コードや社員番号の桁数をそろえる
どんな時に使う?
- 商品コードや管理番号を統一したい時
- レポートの見た目をきれいにしたい時
- データの並び順を正しくしたい時
- ファイル名の連番を整理したい時
0埋めする前と後の比較
0埋め前:1, 2, 10, 100, 23
0埋め後:001, 002, 010, 100, 023
PostgreSQLでの0埋め方法

LPAD関数を使った0埋め
LPAD関数は、文字列の左側に指定した文字を追加して、全体を指定した長さにする関数です。
基本的な使い方
LPAD(対象の文字列, 全体の桁数, 埋める文字)
数値を0埋めする例
-- 数値を文字列に変換してから0埋め
SELECT
product_id,
LPAD(CAST(product_id AS TEXT), 5, '0') AS padded_id
FROM products;
実行結果の例
product_id | padded_id
-----------+-----------
7 | 00007
23 | 00023
156 | 00156
1234 | 01234
文字列を0埋めする例
-- 文字列をそのまま0埋め
SELECT
item_code,
LPAD(item_code, 8, '0') AS padded_code
FROM inventory;
実行結果の例
item_code | padded_code
----------+-------------
ABC | 00000ABC
XYZ123 | 00XYZ123
TO_CHAR関数を使った数値の0埋め
TO_CHAR関数は、数値を指定したフォーマットで文字列に変換する関数です。
基本的な使い方
TO_CHAR(数値, 'フォーマット')
0埋めフォーマットの例
-- 5桁で0埋め
SELECT
employee_id,
TO_CHAR(employee_id, 'FM00000') AS formatted_id
FROM employees;
実行結果の例
employee_id | formatted_id
------------+--------------
7 | 00007
45 | 00045
123 | 00123
フォーマット文字の説明
0
:数字を表示、足りない桁は0で埋めるFM
:前後の空白を削除する00000
:5桁の0埋めフォーマット
具体的な使用例

商品コードの統一
-- 商品テーブルのサンプルデータ
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
code INTEGER
);
INSERT INTO products (name, code) VALUES
('商品A', 1),
('商品B', 25),
('商品C', 156),
('商品D', 1234);
-- 商品コードを6桁の0埋めで表示
SELECT
name,
code AS original_code,
LPAD(CAST(code AS TEXT), 6, '0') AS formatted_code
FROM products
ORDER BY code;
実行結果
name | original_code | formatted_code
-------+---------------+----------------
商品A | 1 | 000001
商品B | 25 | 000025
商品C | 156 | 000156
商品D | 1234 | 001234
日付と組み合わせた連番作成
-- 注文番号を年月日+連番で作成
SELECT
order_id,
TO_CHAR(created_at, 'YYYYMMDD') ||
LPAD(CAST(order_id AS TEXT), 4, '0') AS order_number
FROM orders
WHERE created_at >= '2024-01-01';
実行結果の例
order_id | order_number
---------+--------------
1 | 202401010001
25 | 202401010025
156 | 202401020156
時刻の0埋め表示
-- 時刻を0埋めで表示
SELECT
event_time,
LPAD(CAST(EXTRACT(HOUR FROM event_time) AS TEXT), 2, '0') || ':' ||
LPAD(CAST(EXTRACT(MINUTE FROM event_time) AS TEXT), 2, '0') AS formatted_time
FROM events;
実行結果の例
event_time | formatted_time
-------------------+----------------
2024-01-01 09:05 | 09:05
2024-01-01 14:30 | 14:30
右側への0埋め(RPAD関数)

通常の0埋めは左側ですが、右側に0を追加したい場合はRPAD関数を使用します。
-- 右側に0を追加
SELECT
product_code,
RPAD(product_code, 8, '0') AS right_padded
FROM products;
実行結果の例
product_code | right_padded
-------------+--------------
ABC | ABC00000
XY123 | XY123000
エラーが発生しやすいケース
元の文字列が指定桁数より長い場合
-- 元の文字列が長すぎる場合
SELECT LPAD('123456789', 5, '0') AS result;
-- 結果:123456789(そのまま表示される)
対処法:文字列を切り詰める
-- 右側を切り詰めてから0埋め
SELECT LPAD(RIGHT('123456789', 5), 5, '0') AS result;
-- 結果:56789
-- 左側を切り詰めてから0埋め
SELECT LPAD(LEFT('123456789', 3), 5, '0') AS result;
-- 結果:00123
NULL値の処理
-- NULL値がある場合の処理
SELECT
product_id,
COALESCE(LPAD(CAST(product_id AS TEXT), 5, '0'), '00000') AS safe_padded
FROM products;
パフォーマンスに関する注意点
大量データでの使用
- LPAD関数は文字列操作のため、大量データでは処理時間がかかる場合があります
- インデックスは元の値に対して作成されるため、0埋め後の値での検索は遅くなります
パフォーマンス改善のコツ
-- 悪い例:毎回0埋めを実行
SELECT LPAD(CAST(id AS TEXT), 8, '0') AS formatted_id
FROM large_table
WHERE LPAD(CAST(id AS TEXT), 8, '0') LIKE '0001%';
-- 良い例:元の値で絞り込んでから0埋め
SELECT LPAD(CAST(id AS TEXT), 8, '0') AS formatted_id
FROM large_table
WHERE id BETWEEN 1000 AND 1999;
実用的な関数を作成する

よく使う0埋めパターンは、関数として作成しておくと便利です。
-- 数値を指定桁数で0埋めする関数
CREATE OR REPLACE FUNCTION zero_pad(
input_number INTEGER,
total_digits INTEGER DEFAULT 5
) RETURNS TEXT AS $$
BEGIN
RETURN LPAD(CAST(input_number AS TEXT), total_digits, '0');
END;
$$ LANGUAGE plpgsql;
-- 使用例
SELECT zero_pad(123, 8) AS result; -- 結果:00000123
SELECT zero_pad(456) AS result; -- 結果:00456(デフォルト5桁)
他のデータベースとの比較
MySQLの場合
-- MySQLではLPADの使い方は同じ
SELECT LPAD(id, 5, '0') FROM table_name;
SQL Serverの場合
-- SQL ServerではRIGHT関数とREPLICATE関数を使用
SELECT RIGHT('00000' + CAST(id AS VARCHAR), 5) FROM table_name;
Oracleの場合
-- OracleではLPADの使い方は同じ
SELECT LPAD(TO_CHAR(id), 5, '0') FROM table_name;
まとめ
方法 | 用途 | 例 | メリット |
---|---|---|---|
LPAD + CAST | 数値を文字列として0埋め | LPAD(CAST(7 AS TEXT), 3, '0') → 007 | 柔軟性が高い |
TO_CHAR | 数値のフォーマット表示 | TO_CHAR(7, 'FM000') → 007 | 数値専用で簡潔 |
RPAD | 右側への0埋め | RPAD('ABC', 6, '0') → ABC000 | 特殊な用途に対応 |
コメント