【PostgreSQL】生成列を定義する
生成列を定義する
PostgreSQL12から使用可能になった『生成列』を使用する方法を紹介します。
生成列とは
生成列とは、『式で表現される列』です。
といってもわかりづらいので、例えば身長と体重があるテーブルで、
『BMIという列名、計算式は体重÷身長の2乗」と定義した列を作ることができます。
あらかじめ作っておけば取得や登録する前に、計算をせずにすむメリットがあります。
生成列の構文
生成列の構文を紹介します。これ単体で使用するのではなく、
テーブルのCREATE文でこの文を使用し、生成列を定義します。
列名 型 GENERATED ALWAYS AS 式 STORED
生成列の例(CASE文を使用した例)
上の構文を使ったCREATE文の例です。
CREATE TABLE test
( ・・・
height numeric, -- 身長
weight numeric, -- 体重
--生成列 : BMI( 体重 ÷ 身長(m)の2乗)の作成
bmi numeric(3,1) GENERATED ALWAYS AS (weight / ((height / 100) * (height / 100))) STORED,
・・・
)
上の例のBMIでは、単に計算結果の列でしたが、
次の文はCASE文を使用した場合分けの例です。
CREATE TABLE test
( ・・・ ,
--生成列の例1:列「category」による場合分け
hoge text GENERATED ALWAYS AS ( -- この列の定義はここから
CASE
WHEN category '1' THEN '一般職'
WHEN category '2' THEN '管理職'
WHEN category '3' THEN '派遣'
WHEN category '4' THEN '再雇用'
ELSE 'それ以外' END
) STORED -- ここまでです
, ・・・
,
--生成列の例2 : 誕生日によるクラス分け
class_name text GENERATED ALWAYS AS
(
CASE
WHEN birthday between '2016/4/1' and '2017/3/31' THEN 'Aクラス'
WHEN birthday between '2017/4/1' and '2018/3/31' THEN 'Bクラス'
WHEN birthday between '2018/4/1' and '2019/3/31' THEN 'Cクラス'
WHEN birthday between '2019/4/1' and '2020/3/31' THEN 'Dクラス'
WHEN birthday between '2020/4/1' and '2021/3/31' THEN 'Eクラス'
ELSE '対象外' END) STORED
, ・・・
)