将表达式计算为列名

Evaluate expression as a column name

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

例如,我有一个 table "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)

我希望 QUERY_3 到 return 与 QUERY_2 相同的结果。如何做到这一点?

标准化 table:

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 的说法,通过为货币添加一列和为每个值添加一行来规范化 table 结构。如果无法做到这一点,动态 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');