首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问记录的成员

访问记录的成员
EN

Stack Overflow用户
提问于 2014-09-26 16:23:57
回答 1查看 3.4K关注 0票数 3

根据each()的文档,它返回setof(key text, value text)。但是,在从SELECT中使用它时,我似乎无法访问keyvalue。我尝试过搜索有关record类型的信息,但我只能找到一些与plpgsql相关的无用信息。

假设我有下表:

代码语言:javascript
复制
CREATE TABLE mytable (
  id SERIAL NOT NULL PRIMARY KEY,
  data HSTORE NOT NULL
);

我运行了一个查询:

代码语言:javascript
复制
SELECT pair
FROM (
  SELECT each(data) AS pair
  FROM mytable
) AS pairs

我得到了record类型的行:

代码语言:javascript
复制
(key1,value1)
(key2,value2)
...

如果我尝试访问keyvalue,就会得到各种错误。

  1. 这是: 选择pair.key,从mytable中选择pair.value作为对(选择每个(数据)作为对) 给予: 错误:表“对”第1行缺少FROM-子句条目: pair.key,^*错误*错误:表“对”SQL状态缺少-子句条目: 42P01字符:8
  2. 这是: 选择pair.key,pair.value FROM (从mytable中选择每个数据作为对(键、值))作为对 给予: 错误:语法错误在或接近"(“第4行:每个(数据)作为对(键,值)^*错误*错误:语法错误在或接近”"(“SQL state: 42601字符: 71”)
  3. 这是: 选择pairs.pair.key,从mytable中选择pairs.pair.value作为对(选择每个(数据)作为对) 给予: 错误:模式“对”不存在*错误*错误:模式“对”不存在SQL状态: 3F000
  4. 这是: 选择pair1,从mytable中选择pair2作为对(选择每个(数据)作为对) 给予: 错误:无法下标类型记录,因为它不是数组*错误*错误:不能下标类型记录,因为它不是数组SQL状态: 42804。

如何在record中正确地访问PostgreSQL类型的成员?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-26 16:55:29

在PostgreSQL 9.3中,使用LATERAL

代码语言:javascript
复制
regress=> SELECT p.key, p.value FROM mytable, LATERAL each(data) p;
 key | value 
-----+-------
 a   | b
 c   | d
(2 rows)

在旧版本中,您必须使用通配符扩展,这有点难看。

代码语言:javascript
复制
regress=> SELECT (pair).*                                
FROM (
  SELECT each(data) AS pair
  FROM mytable
) AS pairs
;
 key | value 
-----+-------
 a   | b
 c   | d
(2 rows)

附带说明:

each返回带有OUT参数的类型化结果集,因此返回类型和列名是已知的。它返回一个集合,即它可以为一次调用返回多个行:

代码语言:javascript
复制
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参数的函数不能像我前面所示的那样使用,因此您必须为这些函数提供一个特殊的格式param-list。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26064091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档