SQL 中没有列排除语法,只有列包含语法(通过所有列的 * 运算符,或显式列出列名)。
仅生成您想要的列的列表
但是,您可以使用模式表和数据库的一些内置函数生成具有数百个列名的 SQL 语句,减去您不想要的少数重复列。
SELECT
'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
SELECT 'demographics' || '.' || column_name
FROM information_schema.columns
WHERE table_name = 'demographics'
AND column_name NOT IN ('zip')
UNION ALL
SELECT 'community' || '.' || column_name
FROM information_schema.columns
WHERE table_name = 'community'
AND column_name NOT IN ('fips')
), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement
这只会打印出语句,不会执行它。然后你只需复制结果并运行它。
如果您想一次性动态生成和运行语句,那么您可以阅读PostgreSQL 文档中的如何运行动态 SQL 。
在列名前加上表名
或者,这会生成一个包含所有列的选择列表,包括具有重复数据的列,然后将它们别名为包括每列的表名。
SELECT
'SELECT ' || ARRAY_TO_STRING(ARRAY(
SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
FROM information_schema.columns
WHERE table_name in ('sampledata', 'demographics', 'community')
), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement
同样,这只会生成语句。如果你想动态生成和运行语句,那么你需要为你的数据库复习动态 SQL 执行,否则只需复制并运行结果。
如果您真的想在列别名中使用点分隔符,那么您必须使用双引号别名,例如SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"'
. 但是,双引号别名可能会导致额外的复杂性(区分大小写等);因此,我使用下划线字符将表名与别名中的列名分开,然后可以将别名视为常规列名。