2017-10-26 5 views
0

式の結果を列名として使用したいと考えています。例えば式を列名として評価する

私はQUERY_3がQUERY_2と同じ結果を返したいだけ行

--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) 

持つテーブル「CBR」を有します。これはどうすればできますか?

答えて

0

最良の選択@Clodoaldoネトが述べたように各値に対して通貨の列と行を追加することにより、テーブル構造を正規化することです。これができない場合は、動的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"を引数として取り、それを列名の一部として使用します。あなたはこの関数を呼び出すことによって、あなたの2番目のクエリの結果を得ることができます。

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

私はpsqlの(PostgreSQLの)9.6.5 を持っているあなたのソリューションはここで働いていないように見えます。 エラー:クエリの構造体が関数の結果の型と一致しません DETAIL:返される型の倍精度が、列1の期待される型の数値と一致しません。 –

+0

値の列のデータ型は?私は彼らが小数であると仮定していた、彼らは倍増ですか?もしそうなら、関数の戻り値の型をSETOF DECIMALからSETOF DOUBLE PRECISIONに変更する必要があります。 – danjuggler

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