Поскольку вы используете COPY FROM для известной большой таблицы, CREATE a FUNCTION, которая возвращает SETOF bigtable и SELECT выбирает все столбцы определенного типа, используйте NULL AS fieldname для полей, которые не требуются в этом конкретном случае, что-то вроде :
# \d SMALL
Table "public.small"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# \d LARGE
Table "public.large"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# CREATE OR REPLACE FUNCTION myData()
RETURNS SETOF large LANGUAGE SQL AS $$
SELECT a,
CASE WHEN a = 1
THEN b
ELSE
NULL
END as b,
CASE WHEN a = 2
THEN c
ELSE
NULL
END AS c,
d
FROM small;
$$;
# SELECT * FROM mydata();
# COPY (SELECT * FROM myData()) TO STDOUT;
Очевидно, что SQL может быть не лучшим языком для использования, поэтому PL / PgSQL или PL / Perl (или любой другой) могут быть подходящими.