问题
Is it possible to filter on column names themselves in psql? I want to generate a limited version of the original table (with several hundred columns) in a separate schema a la (pseudocode):
create table why.am_i_doing_this
select *
from original.table
where column_name_of_the_table not in ('column_1', 'column_2' );
回答1:
Build the DDL command dynamically. You can do it in two steps:
Build statement:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT ' || string_agg(column_name, ', ' ORDER BY ordinal_position) || ' FROM original.table' FROM information_schema.columns WHERE table_schema = 'original' AND table_name = 'table' AND column_name NOT IN ('column_1', 'column_2');(Check it's good!) Then execute the generated statement in a second round trip to the server.
This is based on the information schema view information_schema.columns. Alternatively, you could use pg_catalog.pg_attribute. Related:
- How to check if a table exists in a given schema
But it can be done in a single round trip to the server, too:
With a DO statement from any client
DO is just a simple wrapper for ad-hoc execution of PL/pgSQL code. You might do the same in a function or procedure.
DO
$$
BEGIN
EXECUTE (
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')
);
END
$$;
Simpler with psql meta-command \gexec
Since you mentioned the default interactive terminal psql. There you can use \gexec. It ...
Sends the current query buffer to the server, then treats each column of each row of the query's output (if any) as a SQL statement to be executed.
So:
SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
|| string_agg(column_name, ', ' ORDER BY ordinal_position)
|| ' FROM original.table'
FROM information_schema.columns
WHERE table_schema = 'original'
AND table_name = 'table'
AND column_name NOT IN ('column_1', 'column_2')\gexec
来源:https://stackoverflow.com/questions/61294986/filter-column-names-from-existing-table-for-sql-ddl-statement