2017-08-02 4 views
1

サブクエリから複数の列を選択したいとします。ここに私の最小限の例:2つの値を返す2つの戻り値を持つSELECTサブクエリー

機能

CREATE OR REPLACE FUNCTION dummy_function(my_text text) 
RETURNS TABLE (id Integer, remark text) AS $$ 
BEGIN 
RETURN QUERY SELECT 42, upper(my_text); 
END; 
$$ LANGUAGE plpgsql; 

マイに動作していないクエリ

SELECT 
    id, 
    city_name, 
    dummy_function(city_name) 
FROM 
    (SELECT 1 as id, 'Paris' as city_name 
    UNION ALL 
    SELECT 2 as id, 'Barcelona' as city_name 
    ) AS dummy_table 

マイ間違った結果

id | city_name | dummy_function 
----+-----------+---------------- 
    1 | Paris  | (42,PARIS) 
    2 | Barcelona | (42,BARCELONA) 

しかし私はこのような結果を持っているしたいと思います:

id | city_name | number | new_text 
----+-----------+--------------------- 
    1 | Paris  | 42 | PARIS 
    2 | Barcelona | 42 | BARCELONA 

あなたは二度の機能を実行せずにこれを達成する方法を知っていますか?

答えて

2

FROM句の行を返す関数(または列のセット)を使用:the documentation当たり

SELECT 
    dummy_table.id, 
    city_name, 
    dummy_function.id, 
    remark 
FROM 
    (SELECT 1 as id, 'Paris' as city_name 
    UNION ALL 
    SELECT 2 as id, 'Barcelona' as city_name 
    ) AS dummy_table, 
    LATERAL dummy_function(city_name) 

id | city_name | id | remark 
----+-----------+----+----------- 
    1 | Paris  | 42 | PARIS 
    2 | Barcelona | 42 | BARCELONA 
(2 rows)  

によっても先行させることができるから現れる

表機能キーワードLATERALですが、関数の場合、キーワードはオプションです。関数の引数には、前のFROM項目によって提供された列への参照を含めることができます。

+0

これはうまく動作します:-) しかし、以下の答えでは、私は同じ結果を得ていますが、 'LATERAL'を使用していません。 この場合、なぜ「LATERAL」を使うべきですか? –

+1

アドワーズされた回答を参照してください。 – klin

2
SELECT 
    dummy_table.id, 
    city_name, 
    df.id as number, 
    df.remark as new_text 
FROM 
    (SELECT 1 as id, 'Paris' as city_name 
    UNION ALL 
    SELECT 2 as id, 'Barcelona' as city_name 
    ) AS dummy_table, 
    dummy_function(city_name) df 
+0

'dummy_table'と' dummy_function'の両方に存在するため、 'id'に' dummy_table.'を追加してください。 – Lemjur

+0

@Lemjur正解ありがとうございます。 –

+0

それは動作します:-) しかし、上記の答えで私は同じ結果を得るが、 'LATERAL'を使用します。 なぜ「LATERAL」は必要ありませんか? –

関連する問題