web-dev-qa-db-ja.com

Postgresの整数jsonプロパティにインデックスを作成する方法

私の人生では、整数であるjson列のプロパティにインデックスを作成する方法を理解できません。

私はこの方法で試しました(そして他の何十もの)

_CREATE INDEX user_reputation_idx ON users(("user"->>'reputation')::int)
_

クエリでうまく機能します(例:ORDER BY ("user"->>'reputation')::int

何が欠けていますか?

[〜#〜]更新[〜#〜]

単純な構文エラーが発生していますが、その理由はわかりません。

_ERROR:  syntax error at or near "::"
LINE 1: ... user_reputation_idx ON users (("user"->>'reputation')::int)
_

テーブルの定義は非常に単純です。 type userの1列jsonです。

したがって、次のようになります。

_CREATE TABLE users
(
  "user" json
)
_
7
Christoph

代わりにこれを試してください:

_CREATE INDEX user_reputation_idx ON users(cast("user"->>'reputation' AS int));
_

キャストのPostgres構文ショートカット_::_ は、インデックス定義に追加の括弧がないと許可されません( @ bmaのコメントを参照 )。ただし、標準SQL関数で機能します。cast(expression AS type)これは、jsonタイプ自体には関連していません。

どちらの方法でも、インデックスを使用する式で構文ショートカット_expression::type_を引き続き使用できます。

13

@bmaがコメントで説明したように、JSON定義全体を二重括弧で囲むと、インデックスはそのまま機能します。

CREATE INDEX user_reputation_idx ON users((("user"->>'reputation')::int));

インデックスでは、JSONオブジェクト表記[->]ではなく、JSONテキスト表記[->>]を一貫して使用し、クエリでフィールドを参照するときに使用してください。そうしないと、インデックスは使用されません。

または、オブジェクト表記[->]を一貫して使用できます。どちらかに固執する必要があります。混ぜないでください。

0
moodboom