加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:04:10 所属栏目:百科 来源:网络整理
导读: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 cross
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读