2017-05-19 2 views
2

私は、結合された行を1つ選択し、それをPLSQL変数に格納したいと思います。PostgreSQLのSELECT ... JOIN ... INTOの結果をどのように解釈するのですか?

私の最善の策は、RECORDタイプに見えたが、それはどこでも私を取得できませんでした:

DECLARE cur_acct_and_balance RECORD; 
BEGIN 
    -- we start from _acct 
    SELECT INTO cur_acct_and_balance * 
    FROM Accounts acct JOIN Balances bal ON acct.id = bal.account_id 
    WHERE acct.id = _acct.id AND bal.currency = _currency; 

    -- raise the variable, maybe we learn something... 
    raise exception '%', cur_acct_and_balance; 

ので...私はcur_acct_and_balance変数に何かを置くことに成功したが、何? :D私はそれを点検するために、例外として、結果の変数を上げてみましたありませんが、結果の解釈には運:非常に有用ではありませんでした

ERROR: (5707,5706,,,"{""logid"":""A/1/2/0""}","2017-05-19 21:44:40.672074","2017-05-19 21:44:40.672074",3170,5707,0,191,"2017-05-19 21:44:40.662101","2017-05-19 21:44:40.662101") 

。私はcur_acct_and_balance.acct IS NOT NULLとしてそれを評価しようとした場合、私は私は私は良いリソースはグーグルが見つかりませんでした

ERROR: missing FROM-clause entry for table "acct" 

を得るcur_acct_and_balance.acct.id IS NOT NULLとしてそれを評価しようとすると、私は

ERROR: record "cur_acct_and_balance" has no field "acct" 

を取得するので、私はここで良い人をすることができます願っています今の

UPDATE

^_ ^いくつかの助けになる私は単にfunctiを書き直しジョインを使用しないようにするには、しかし、私はまだ知って興味がある、私はより良い実行する必要があります結合の変形を推測しています。

+1

使用 'jsonbは、 '型なしの' record'の代わりに、より多くのabilitieそれを管理する: 'cur_acct_and_balance jsonbを宣言する; ... from to_jsonb(*)from cur_acct_and_balance into ...; ' – Abelisto

+0

良い点、私はこれで遊ぶよ<3 – bbozo

答えて

1

あなたのレコードは元のテーブルを参照するのではなく、その列のみを参照します。 1つのセットで2つのテーブルを結合しています。つまり、あなたの列、このようにアクセスする必要があります。

cur_acct_and_balance.column_name 

あなたのIF文:

IF cur_acct_and_balance.id IS NOT NULL THEN 
     --If body 
END IF 
+0

問題は、ID列との結合に2つのテーブルがあること、エンジンがどのように我々は意味する?結果セットの行はすべて1つのアカウントとなり、1つの残高が常に結合されているか、存在しません。 – bbozo

+0

これらの列にエイリアスを定義すると、この問題が解決されます。 –

1

いくつかのソリューションがあります。

create temp table a on commit drop as select 1 as x, 2 as y; 
create temp table b on commit drop as select 'a'::text as x, 'b'::text as y; 
do $$ 
declare 
    r record; 
    j jsonb; 
begin 
    -- Explicyt type conversion 
    select a.*, row(b.*)::b as b into r from a,b; 
    raise info '%, %, %', r, r.y, (r.b).x; -- Note parenthesizes 

    -- Columns aliases 
    select a.x as a_x, a.y as a_y, b.x as b_x, b.y as b_y into r from a,b; 
    raise info '%, %', r, r.b_y; 

    -- JSONB 
    select to_jsonb(t.*) into j from (select a.*, to_jsonb(b.*) as b from a,b) as t; 
    raise info '%, %', j, j->'b'->>'x'; 
end $$; 

結果:

 
INFO: (1,2,"(a,b)"), 2, a 
INFO: (1,2,a,b), b 
INFO: {"b": {"x": "a", "y": "b"}, "x": 1, "y": 2}, a 
関連する問題