Steps for Execution:
Table Creation
CREATE TABLE xyz.table_a( id bigint NOT NULL, scores jsonb, CONSTRAINT table_a_pkey PRIMARY KEY (id) );Add some dummy data :
INSERT INTO xyz.table_a( id, scores) VALUES (1, '{"a":20,"b":20}');Function Creation
CREATE OR REPLACE FUNCTION xyz.example( table_name text, regular_columns text, json_column text, view_name text ) RETURNS text LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ DECLARE cols TEXT; cols_sum TEXT; BEGIN EXECUTE format( $ex$SELECT string_agg( format( 'CAST(%2$s->>%%1$L AS INTEGER)', key), ', ' ) FROM (SELECT DISTINCT key FROM %1$s, jsonb_each(%2$s) ORDER BY 1 ) s;$ex$, table_name, json_column ) INTO cols; EXECUTE format( $ex$SELECT string_agg( format( 'CAST(%2$s->>%%1$L AS INTEGER)', key ), '+' ) FROM (SELECT DISTINCT key FROM %1$s, jsonb_each(%2$s) ORDER BY 1) s;$ex$, table_name, json_column ) INTO cols_sum; EXECUTE format( $ex$DROP VIEW IF EXISTS %2$s; CREATE VIEW %2$s AS SELECT %3$s, %4$s, SUM(%5$s) AS total FROM %1$s GROUP BY %3$s$ex$, table_name, view_name, regular_columns, cols, cols_sum ); RETURN cols; END $BODY$:Call Function
SELECT xyz.example( 'xyz.table_a', ' id', 'scores', 'xyz.view_table_a' );
Once you run these steps, I am getting an error
ERROR: column "int4" specified more than once
CONTEXT: SQL statement "
DROP VIEW IF EXISTS xyz.view_table_a;
CREATE VIEW xyz.view_table_a AS
SELECT id, CAST(scores->>'a' AS INTEGER), CAST(scores->>'b' AS INTEGER), SUM(CAST(scores->>'a' AS INTEGER)+CAST(scores->>'b' AS INTEGER)) AS total FROM xyz.table_a GROUP BY id