真正的答案是您实际上做不到(请参阅链接)。几十年来,这一直是一个要求的功能,开发人员拒绝实施它。最佳做法是提及列名而不是*
. 但是*
,它本身就是性能损失的来源。
但是,如果您真的需要使用它,您可能需要直接从模式中选择列 -> 检查LINK。或者如下例使用两个 PostgreSQL 内置函数:ARRAY和ARRAY_TO_STRING。第一个将查询结果转换为数组,第二个将数组组件连接成字符串。列表组件分隔符可以用ARRAY_TO_STRING函数的第二个参数指定;
SELECT 'SELECT ' ||
ARRAY_TO_STRING(ARRAY(SELECT COLUMN_NAME::VARCHAR(50)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='view4' AND
COLUMN_NAME NOT IN ('col2')
ORDER BY ORDINAL_POSITION
), ', ') || ' FROM view4';
其中字符串与标准运算符连接||
。COLUMN_NAME 数据类型是 information_schema.sql_identifier。此数据类型需要显式转换为 CHAR/VARCHAR 数据类型。
但这也不推荐,如果您从长远来看添加更多列但该查询不一定需要它们怎么办?您将开始拉出比您需要的更多的列。
如果选择是插入的一部分,如
Insert into tableA (col1, col2, col3.. coln) Select everything but 2 columns FROM tableB
列匹配将是错误的,您的插入将失败。
这是可能的,但我仍然建议为每个写入的选择编写每个需要的列,即使几乎每一列都是必需的。
结论:
由于您已经在使用 a VIEW
,因此最简单和最可靠的方法是更改您的视图并提及列名,不包括您的第二列..