2017-08-02 65 views
1

我想從子查詢中選擇多個列。在這裏我的小例子:具有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子句中使用函數返回行(或一組行的):

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)  

the documentation

出現在

表功能也可以由前面關鍵字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.'添加到'id',因爲它同時存在於'dummy_table'和'dummy_function' – Lemjur

+0

@Lemjur正確的謝謝。 –

+0

它的工作原理:-) 但在上面的答案中,我得到了相同的結果,但是使用了'LATERAL'。 爲什麼你不需要'LATERAL'? –