【PostgreSQL】生成列を定義する

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

    , ・・・
)