Вероятно, наиболее гибким и эффективным способом является динамическое создание temporary view
с использованием функции:
create or replace function f_prepare(tname text, vname text) returns text language plpgsql as $$
begin
execute format(
'create or replace temporary view %I as select * from %I',
vname, tname);
return vname;
end $$;
Затем вы можете использовать созданное представление обычным способом, например;
select f_prepare('pg_class', 'v_class');
select * from v_class where relname = 'pg_database'; -- Index on the source table will be used here
и используя ваш код:
select f_prepare((select col1 from meta_table where col2 = 'val2'), 'v');
select * from v;
И, как и любые другие временные объекты, созданные представления не будут конфликтовать с другими сеансами и будут отбрасываться при отключении.