11

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, attribute, 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);

私は得る:ERROR: extension "tablefunc" already exists

でもコメントアウトしたらCREATE EXTENSION

私は得る:ERROR: function crosstab(unknown) does not exist

この悪循環から抜け出すにはどうすればよいでしょうか。それは既知の問題ですか?

4

3 に答える 3

4

あなたの答えには誤解があります:

その中のすべてのスキーマにアクセスできるわけではありません。

同じデータベース内のすべてのスキーマは、同じデータベース内のすべてのセッションからアクセスできます (特権が与えられている限り)。を設定する問題ですsearch_path。スキーマは、ファイル システムのディレクトリ/フォルダーと同じように機能します。

または、関数 (および演算子も) をスキーマ修飾して、 とは無関係にアクセスできますsearch_path

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

より多くの情報を含む最近の関連回答:
How to use % operator from the extension pg_trgm?

疑わしいcrosstab()

クエリは属性'att2''att3'を返しましたが、列定義リストにcategory_1, category_2, category_3はクエリに一致しない 3 つのカテゴリ ( ) がありました。crosstab() の 2 番目のパラメーター (「安全な」バージョン)
を削除して追加しました。category_1詳細はこちら:
PostgreSQL クロス集計クエリ

value余談:列名として使用しないでください。Postgresがそれを容認しているとしても。標準 SQLの予約語です。

于 2014-04-15T02:15:57.647 に答える