PostgreSQL如何按列位置而非列名查询数据列?
我知道PostgreSQL里可以按列位置排序,语法是合法的:
SELECT this, that, other FROM mytable ORDER BY 3, 2, 1; -- 按列位置排序
但我找不到按位置直接选择列的语法:
SELECT 1, 2, 3 FROM mytable ORDER BY 3, 2, 1; -- 语法合法,但结果不对 :-( SELECT COLUMN_VALUE( 1 ), COLUMN_VALUE( 2 ), COLUMN_VALUE( 3 ) FROM mytable; -- 语法不合法 :-
我拿ORDER BY举例只是想说明PostgreSQL存在按列位置引用的语法,本身并不关心排序功能。
在质疑“为什么不直接用列名”之前,先说明我的使用场景:我有一张存储各类数据指标(长度、宽度、重量、颜色、多个形状FFT系数等数十项)的大表,需要计算协方差矩阵这类复杂操作,而且并非所有数据始终相关,所以需要动态选择数据。我不是手动写查询,而是写生成查询的代码,这时候按列序号而非列名访问数据能大幅简化查询生成逻辑。
比如,如果能使用SELECT COLUMN_VALUE( 1 ) AS x1, COLUMN_VALUE( 2 ) AS x2, ...,后续写( x - x1 )*( x - x2 )这类表达式会更便捷。当然我也可以写SELECT this AS x1, that AS x2,但这需要在代码里实现COLUMN_VALUE( COLUMN_NAME_LOOKUP( n ) )的逻辑,而我真正想要的是直接用COLUMN_VALUE( n ),显然后者更直接。
我想知道PostgreSQL是否存在类似COLUMN_VALUE(n)的简洁语法?或者有没有其他实现方式?
另外,我不认同“按列位置查询危险或不明智”的观点:PostgreSQL的INSERT语法允许不指定列名,依赖列位置,如果列位置改变确实会受影响,但同理SELECT支持按位置访问列也是合理的,我清楚这么做的风险与收益,只是想了解PostgreSQL是否支持该功能。
内容的提问来源于stack exchange,提问作者omatai

