PostgreSQLで0埋め(ゼロパディング)する方法|完全ガイド

データベース・SQL

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特殊な用途に対応

コメント

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