2014-09-01 76 views
0

我需要一个SQL函数来返回带有一些常规列和一些数组列的表。PostgreSQL - 带数组列的返回表

CREATE OR REPLACE FUNCTION fn_get_some_properties(...) 
    RETURNS TABLE(
     someText TEXT, 
     someBool BOOLEAN, 
     someInt  INTEGER, 
     propID  INTEGER[], 
     propVal  TEXT[] 
    ) AS 
... 

检索被存储在两个表的属性:一个用于标量值 - someTextsomeBoolsomeInt;另一个是阵列。 它们通过一些全局键连接。

select * from Table1 where key_column= MyGlobalKey; 
select * from Table2 where key_column= MyGlobalKey; 

所以回到我的问题。如何将第二个查询(Table2)的结果转换为数组propIDpropVal并返回结果。

CREATE TABLE Table1 (
    key_column  INTEGER, -- key_column is a primary key here, hence unique 
    someText  TEXT, 
    someBool  BOOLEAN, 
    someInt   INTEGER 
    ... 

CREATE TABLE Table2 (
    key_column  INTEGER, -- key_column is not unique here 
    prop_id   INTEGER, 
    prop_val  TEXT, 
    ... 
+0

你有没有尝试过你写的?有用。你使用什么语言(SQL除外)? – 2014-09-01 15:45:29

+0

当您尝试第二个查询时会发生什么?应该发生什么呢? – 2014-09-01 17:06:29

+0

我的解释有误导性。抱歉。我的意思是说第二个表的值存储为常规行,所以问题是将这些行转换为单行数组类型,然后将它加入到第一个表中...... – giladrv 2014-09-02 06:03:21

回答

0

JOIN这两个表。

在我的例子中使用LEFT [OUTER] JOIN,假设你总是希望给定的MyGlobalKey来自table1的值,并且只添加table2中的值(如果它们存在的话)。

CREATE OR REPLACE FUNCTION fn_get_some_properties(_myglobalkey int) 
    RETURNS TABLE(
     someText text, 
     someBool boolean, 
     someInt integer, 
     propID integer[], 
     propVal text[] 
    ) AS 
$func$ 
SELECT t1.someText, t1.someBool, t1.someInt 
     ,t2.propID, t2.propVal 
FROM table1 t1 
LEFT JOIN table2 t2 USING (key_column) 
WHERE t1.key_column = $1 
$func$ LANGUAGE sql; 

当然,这应该是1:1的关系,或者你可能会得到多个组合的行。 SQL基础知识,details in the manual

0

好的,找到了一个方法。沿线的东西:

SELECT someText, someBool, someInt 
    , array(SELECT prop_id FROM Table2 WHERE key_column = mykey) 
    , array(SELECT prop_val FROM Table2 WHERE key_column = mykey) 
FROM Table1 WHERE key_column = mykey