Существует гораздо более простой способ сделать это.
SELECT pg_typeof(col)::text FROM tbl LIMIT 1
Единственным предварительным условием является то, что таблица шаблонов содержит хотя бы одну строку . См. Руководство для pg_typeof ()
Как писал Милен, вам нужно EXECUTE
динамические операторы DDL, подобные этим.
Гораздо проще DO
утверждение:
DO $$BEGIN
EXECUTE 'CREATE TABLE egg (id '
|| (SELECT pg_typeof(col)::text FROM tbl LIMIT 1) || ')';
END$$;
Или, если вы не уверены, что в таблице шаблонов есть какие-либо строки:
DO $$BEGIN
EXECUTE (
SELECT format('CREATE TABLE egg (id %s)'
, format_type(atttypid, atttypmod))
FROM pg_catalog.pg_attribute
WHERE attrelid = 'tbl'::regclass -- name of template table
AND attname = 'col' -- name of template column
AND attnum > 0 AND NOT attisdropped
);
END$$;
Эти условия кажутся избыточными, так как вы ищете какой-либо конкретный столбец любой
format()
требуется Postgres 9,1 +.
Связанный: