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] 举报,一经查实,本站将立刻删除。