私の人生では、整数である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
)
_
代わりにこれを試してください:
_CREATE INDEX user_reputation_idx ON users(cast("user"->>'reputation' AS int));
_
キャストのPostgres構文ショートカット_::
_ は、インデックス定義に追加の括弧がないと許可されません( @ bmaのコメントを参照 )。ただし、標準SQL関数で機能します。cast(expression AS type)
これは、json
タイプ自体には関連していません。
どちらの方法でも、インデックスを使用する式で構文ショートカット_expression::type
_を引き続き使用できます。
@bmaがコメントで説明したように、JSON定義全体を二重括弧で囲むと、インデックスはそのまま機能します。
CREATE INDEX user_reputation_idx ON users((("user"->>'reputation')::int));
インデックスでは、JSONオブジェクト表記[->]ではなく、JSONテキスト表記[->>]を一貫して使用し、クエリでフィールドを参照するときに使用してください。そうしないと、インデックスは使用されません。
または、オブジェクト表記[->]を一貫して使用できます。どちらかに固執する必要があります。混ぜないでください。