What is the most elegant (i.e. readable and easy to maintain) way to select columns based on the results of a subquery (using Postgres 9.3)?
Here's some example data:
create temporary table if not exists food ( id serial primary key, pet_id varchar, steak integer, chicken integer, fish integer, veg integer ); insert into food (pet_id, steak, chicken, fish, veg) values (1, 100, 10, 1, 78), (2, 140, 100, 1100, 7), (3, 10, 10, 10, 7); create temporary table if not exists foodtypes ( id serial primary key, name varchar, meat boolean ); insert into foodtypes (name, meat) values ('steak', true), ('chicken', true), ('fish', true), ('veg', false); I would like to be able to generate some output for all the pets in the database, with all meaty columns. At the moment, I'm doing that using:
select id, pet_id, steak, chicken, fish from food;
id pet_id steak chicken fish 0 1 1 100 10 1 1 2 2 140 100 1100 2 3 3 10 10 10 3 7 1 100 10 1 4 8 2 140 100 1100 5 9 3 10 10 10 However, what happens if another pet store operator adds a new meaty food type to the foodtypes table? It won't be included in the results
Ideally, for maintainability and consistency, I would like to be able to choose my columns based on a subquery - something like:
select name, (select distinct name from foodtypes where meat = true) from food;
This doesn't work. I've read that a lateral join may be useful but I am not sure how it would help achieve this.