将表达式计算为列名

时间:2017-10-26 14:07:30

标签: 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;

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


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

 ?column?  
-----------
 value_usd
(1 row)

我希望QUERY_3返回与QUERY_2相同的结果。怎么办呢?

2 个答案:

答案 0 :(得分:1)

规范化表格:

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       

答案 1 :(得分:0)

最好的选择是通过添加货币列和每个值的行来规范化表结构,如@Clodoaldo Neto所述。如果无法做到这一点,动态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');