微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 无法在Postgres中使用交叉表

OSX 10.9.2上的Postgres 9.2.1.

如果我运行以下交叉表示例查询

CREATE EXTENSION tablefunc; 

CREATE TABLE ct(id SERIAL,rowid TEXT,attribute TEXT,value TEXT);
INSERT INTO ct(rowid,attribute,value) VALUES('test1','att1','val1');

SELECT *
FROM crosstab(
  'select rowid,value
   from ct
   where attribute = ''att2'' or attribute = ''att3''
   order by 1,2')
AS ct(row_name text,category_1 text,category_2 text,category_3 text);

我得到:错误:扩展“tablefunc”已经存在

但是,如果我评论出CREATE EXTENSION

我得到:错误函数交叉表(未知)不存在

我怎样才能摆脱这种恶性循环?这是一个已知的问题吗?

解决方法

你的回答有一种误解:

and not accessible to all schemas in it.

同一数据库中的所有模式都可以访问同一数据库中的所有会话(只要给出了权限).这是设置search_path的问题.模式的工作方式与文件系统中的目录/文件夹非常相似.

或者,您可以对函数(甚至运算符)进行模式限定,以独立于search_path访问它:

SELECT *
FROM my_extension_schema.crosstab(
    $$select rowid,"value"
      from   ct
      where  attribute IN ('att2','att3')
      order  by 1,2$$,$$VALUES ('att2'),('att3')$$
   ) AS ct(row_name text,category_3 text);

最近的相关答案更多信息:
How to use % operator from the extension pg_trgm?

可疑的交叉表()

您的查询返回了属性’att2’和’att3′,但列定义列表有三个与查询不匹配的类别(category_1,category_2,category_3).
删除了category_1并将第二个参数添加到了crosstab() – “安全”版本.更多细节在这里
PostgreSQL Crosstab Query

旁白:不要将值用作列名.即使Postgres容忍它.这是reserved word in standard SQL.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐