I want to INSERT some records from a query into a table that has a column with the type of a composite type.
create type ratio as (numerator bigint, denominator bigint);
create table my_ratios(id bigint, val ratio);
Inserting some values naturally works:
insert into my_ratios (id, val) values (1, (22, 7)) returning *;
But this does not:
-- this does not work:
insert into my_ratios
SELECT
round(n::float / d * 100)
, (n, d) as ratio -- cannot cast type record to ratio
FROM generate_series(21, 23) n
, generate_series(6, 8) d
returning *;
I found that if I cast the rowtype to text and cast the text back to my composite type, then the query works. But this is quite ugly:
insert into my_ratios
SELECT
round(n::float / d * 100)
, cast(cast((n, d) as text) as ratio) -- note two casts
FROM generate_series(21, 23) n
, generate_series(6, 8) d
returning *;
Is there a special syntax that I can use here?