Sql 将表达式计算为列名

Sql 将表达式计算为列名,sql,postgresql,eval,Sql,Postgresql,Eval,我想使用表达式的结果作为列名 例如,我有一个表“cbr”,其中只有一行 --QUERY_1 SELECT * FROM cbr; value_usd | value_uah | value_kzt | value_rur -----------+-----------+-----------+----------- 57.0861 | 2.15257 | 0.171365 | 1 --QUERY_2 SELECT value_usd from cbr;

我想使用表达式的结果作为列名

例如,我有一个表“cbr”,其中只有一行

--QUERY_1
SELECT * FROM cbr;

 value_usd | value_uah | value_kzt | value_rur 
-----------+-----------+-----------+-----------
   57.0861 |   2.15257 |  0.171365 |         1


--QUERY_2
SELECT value_usd from cbr;

 value_usd 
-----------
   57.0861


--QUERY_3
SELECT 'value_'||'usd' from cbr;

 ?column?  
-----------
 value_usd
(1 row)
我希望查询3返回与查询2相同的结果。如何做到这一点?

规范化表格:

create table cbr (
    currency char(3),
    value numeric
);

insert into cbr (currency, value) values 
    ('usd',57.0861),('uah',2.15257),('kzt',0.171365),('rur',1)
;

select *
from cbr
where currency = 'usd'
;
 currency |  value  
----------+---------                                                                                                                                                      
 usd      | 57.0861       

最好的选择是按照@Clodoaldo Neto所述,通过为currency添加一列,为每个值添加一行,来规范表结构。如果不能做到这一点,动态SQL是您的下一个最佳选择。注意,它必须在pl/pgsql代码中使用。下面是一个例子:

CREATE OR REPLACE FUNCTION GetCurrencyValue(Currency text)
RETURNS SETOF DOUBLE PRECISION AS
$BODY$
BEGIN
  RETURN QUERY EXECUTE 'SELECT value_'||Currency||' from cbr;';
END;
$BODY$
LANGUAGE plpgsql;
此函数接受参数“Currency”,并将其用作列名的一部分。然后,您可以通过调用以下函数获得第二次查询的结果:

--Updated QUERY_3
SELECT * FROM GetCurrencyValue('usd');

我有psql(PostgreSQL)9.6.5,看起来您的解决方案在这里不起作用。错误:查询结构与函数结果类型详细信息不匹配:返回的类型double precision与第1列中的预期类型numeric不匹配。值列的数据类型是什么?我假设它们是小数,它们是双精度的吗?如果是这样,那么您需要将函数的返回类型从SETOF DECIMAL更改为SETOF DOUBLE PRECISION。