skip to Main Content

I have two tables named property and equipment_type.

CREATE TABLE IF NOT EXISTS equipment_type (
    class_code              class_code          NOT NULL,
    major_code              character(2)        NOT NULL,
    minor_code              character(2)        NOT NULL,
    estimated_useful_life   integer             NOT NULL,    -- in years
    PRIMARY KEY (class_code, major_code, minor_code)
);
CREATE TABLE IF NOT EXISTS PROPERTY(
    property_number         character(16)       PRIMARY KEY,
    class_code              class_code          NOT NULL,
    major_code              character(2)        NOT NULL,
    minor_code              character(2)        NOT NULL,
    date_acquired           date                NOT NULL,               
    warranty_period         integer,
    warranty_start_date     date,
    warranty_end_date       date
        GENERATED ALWAYS AS (
            warranty_start_date + (interval '1 year' *  warranty_period)
        ) STORED,
    is_beyond_ul            boolean
        GENERATED ALWAYS AS (
            -- condition
        ) STORED,
    FOREIGN KEY (class_code, major_code, minor_code)
        REFERENCES equipment_type (class_code, major_code, minor_code)
);

Sample data:

INSERT INTO equipment_type (class_code, major_code, minor_code, estimated_useful_life)
    VALUES
        ('CE', '01', '01', 10),
        ('CE', '02', '01', 10);
INSERT INTO PPE (property_number, class_code, major_code, minor_code, date_acquired, warranty_period, warranty_start_date)
    VALUES
        ('10-0518IT39020042', 'CE', '01', '01', '2014-12-01', 1, '2014-12-01'),
        ('10-0518IT39020034', 'CE', '02', '01', '2015-03-15', 3, '2015-03-18');

I want to generate the value for is_beyond_UL column, where it will be true if CURRENT_DATE - date_acquired > equipment_type.estimated_useful_life, and false otherwise. How do i do this?

2

Answers


  1. A generated column can only access column values from other columns in the same row of the table.

    You can’t have a generated column the way you want because it not only uses information from a completely different table, but it also depends on a function that changes its value every day. So the generated column would change its value without any changes to the table at all – which is also not supported.

    If you want to avoid writing that expression, then create a view that joins the two tables and calculates that expression.

    select ... other columns ....,
           CURRENT_DATE - p.date_acquired > et.estimated_useful_life as is_beyond_ul            
    from property p
       join equipment_type et on ...;
       
    
    Login or Signup to reply.
  2. Generated column has its limits:

    The generation expression can only use immutable functions and cannot use subqueries or reference anything other than the current row in any way.

    Besides that, your calculation “CURRENT_DATE – date_acquired > equipment_type.estimated_useful_life” has CURRENT_DATE that changes over time, which means the value can’t be persisted.

    PostgreSQL currently implements only stored generated columns.

    What you need is something that is computed at query time.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search