【问题标题】:Access members of record访问记录成员
【发布时间】:2014-11-21 17:34:32
【问题描述】:

根据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(data) 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 类型的成员?

【问题讨论】:

  • each 用于hstore,而不是record
  • @CraigRinger each(hstore) 返回setof record

标签: sql postgresql postgresql-9.1


【解决方案1】:

在 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 参数的函数不能像我上面显示的那样使用,你必须提供一个特殊的此类函数的格式参数列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2011-02-21
    • 2012-01-13
    • 2021-10-08
    • 2012-10-18
    相关资源
    最近更新 更多