根据each()的文档,它返回setof(key text, value text)。但是,在从SELECT中使用它时,我似乎无法访问key或value。我尝试过搜索有关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)
...如果我尝试访问key或value,就会得到各种错误。
如何在record中正确地访问PostgreSQL类型的成员?
发布于 2014-09-26 16:55:29
在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)我之所以提到这一点,是因为返回record或setof record而没有键入OUT参数的函数不能像我前面所示的那样使用,因此您必须为这些函数提供一个特殊的格式param-list。
https://stackoverflow.com/questions/26064091
复制相似问题