【PostgreSQL】PostgreSQL ~ ゼロ埋め ~

◾️はじめに

小ネタ。

友人と飲みに行った時にSQLの質問されて
試しにやってみたら、思ったより勉強になった。
そのついでに出てきた、ゼロ埋めをメモっておく

目次

【1】ゼロ埋め
 方法1:TO_CHAR+FM 接頭辞 を使う
 方法2:LPAD を使う
【2】サンプル
 例1:TO_CHAR+'FM000'
 例2:LPAD for UPDATE

【1】ゼロ埋め

方法1:TO_CHAR+FM 接頭辞を使う

* FM 接頭辞: 字詰めモード (空白およびゼロのパディングを無効)

https://www.postgresql.jp/document/7.4/html/functions-formatting.html

構文

TO_CHAR(数字, 'FM0...')

例:3桁ゼロ埋め

TO_CHAR(12, 'FM000') -- '012'(左側をゼロ埋め)

方法2:LPAD を使う

* LPAD:文字列を左側に挿入する

構文

LPAD( 文字列, 調整後の文字数 [, 挿入する文字列 ] )

例:3桁ゼロ埋め

LPAD(memo, 3, '0')

【2】サンプル

* 以下のサイトで実行

https://www.db-fiddle.com

例1:TO_CHAR+'FM000'

CREATE TABLE country1 (
  name     VARCHAR(50),
  memo     VARCHAR(50),
  code     integer
);

INSERT INTO country1 (name,memo,code) VALUES
  ('Japan', '1', 1),
  ('Korea', '2', 2),
  ('China', 'A1', NULL),
  ('USA', '146', NULL),
  ('Italy', 'AAA', NULL),
  ('Australia', '125', 125)
;

SELECT name,memo,TO_CHAR(code, 'FM000') FROM country1;
name memo to_char
Japan 1 001
Korea 2 002
China A1
USA 146
Italy AAA
Australia 125 125

例2:LPAD for UPDATE

CREATE TABLE country (
  name     VARCHAR(50),
  memo     VARCHAR(50),
  country_code     VARCHAR(3)
);

INSERT INTO country (name,memo,country_code) VALUES
  ('Japan', '1', NULL),
  ('Korea', '2', NULL),
  ('China', 'A1', NULL),
  ('USA', '146', NULL),
  ('Italy', 'AAA', NULL),
  ('Australia', '125', NULL)
;

UPDATE country
SET country_code = LPAD(memo, 3, '0')
WHERE memo ~ '^[0-9]+$'
  AND CAST(memo AS INTEGER) BETWEEN 0 AND 125;

-- 確認
SELECT * FROM country;

関連記事

SQLでマスキングを実装
https://dk521123.hatenablog.com/entry/2022/10/02/000000
Snowflake ~ 文字列操作関連 ~
https://dk521123.hatenablog.com/entry/2022/10/01/000000