2014-09-26 107 views
3

根據each()的文檔,它返回setof(key text, value text)。但是,從SELECT使用它時,我似乎無法訪問keyvalue。我試過尋找關於record類型的信息,但我能找到的所有信息都與plpgsql無關。記錄的訪問成員

說我有如下表:

CREATE TABLE mytable (
    id SERIAL NOT NULL PRIMARY KEY, 
    data HSTORE NOT NULL 
); 

我運行查詢:

SELECT pair 
FROM (
    SELECT each(data) AS pair 
    FROM mytable 
) AS pairs 

我得到record類型的行:

(key1,value1) 
(key2,value2) 
... 

,如果我嘗試訪問keyvalue,我得到各種錯誤。

  1. 此:

    SELECT pair.key, pair.value 
    FROM (
        SELECT each(data) AS pair 
        FROM mytable 
    ) AS pairs 
    

    給出:

    ERROR: missing FROM-clause entry for table "pair" 
    LINE 1: pair.key, 
         ^
    ********** Error ********** 
    
    ERROR: missing FROM-clause entry for table "pair" 
    SQL state: 42P01 
    Character: 8 
    
  2. 此:

    SELECT pair.key, pair.value 
    FROM (
        SELECT each(data) AS pair (key, value) 
        FROM mytable 
    ) AS pairs 
    

    給出:

    ERROR: syntax error at or near "(" 
    LINE 4: each(attributes) AS pair (key, value) 
               ^
    
    ********** Error ********** 
    
    ERROR: syntax error at or near "(" 
    SQL state: 42601 
    Character: 71 
    
  3. 此:

    SELECT pairs.pair.key, pairs.pair.value 
    FROM (
        SELECT each(data) AS pair 
        FROM mytable 
    ) AS pairs 
    

    給出:

    ERROR: schema "pairs" does not exist 
    
    ********** Error ********** 
    
    ERROR: schema "pairs" does not exist 
    SQL state: 3F000 
    
  4. 此:

    SELECT pair[1], pair[2] 
    FROM (
        SELECT each(data) AS pair 
        FROM mytable 
    ) AS pairs 
    

    給出:

    ERROR: cannot subscript type record because it is not an array 
    
    ********** Error ********** 
    
    ERROR: cannot subscript type record because it is not an array 
    SQL state: 42804 
    

如何在PostgreSQL中正確訪問record類型的成員?

+0

'each'用於'hstore',而不是'record'。 – 2014-09-26 16:49:50

+1

@CraigRinger'each(hstore)'返回'setof record'。 – cpburnz 2014-09-26 16:51:13

回答

3

在PostgreSQL 9.3中,使用LATERAL

regress=> SELECT p.key, p.value FROM mytable, LATERAL each(data) p; 
key | value 
-----+------- 
a | b 
c | d 
(2 rows) 

在舊版本中,您必須使用通配符擴展,這有點難看。

regress=> SELECT (pair).*         
FROM (
    SELECT each(data) AS pair 
    FROM mytable 
) AS pairs 
; 
key | value 
-----+------- 
a | b 
c | d 
(2 rows) 

旁註:

each返回一個類型化的結果與OUT參數設置,因此,返回類型和列名是已知的。它返回一組,即它可能返回多行的一個調用:

regress=> \df each 
            List of functions 
Schema | Name | Result data type |   Argument data types   | Type 
--------+------+------------------+-----------------------------------------+-------- 
public | each | SETOF record  | hs hstore, OUT key text, OUT value text | normal 
(1 row) 

我提到這一點,因爲這將返回recordsetof record沒有類型OUT參數的函數不能用我上面顯示的方式,你必須爲這些功能提供特殊的格式參數列表。