11

「新しい」JSONBタイプを使用しようとしています。

jsonb フィールドを持つdocumentsテーブルがあり、その中に field があります。2013 年から 2015 年など、ある年の範囲内のすべてのドキュメント レコードを検索したいと考えています。 [編集: 以下の完全一致の例を使用しましたが、値の範囲のクエリがここでの主な課題です。要求されたアプローチは、たとえばドル範囲 (価格 > $20 および価格 < $40) またはタイムスタンプ範囲にも適用されます)。]propertiespublication_year

私が試してみました:

create index test1 on documents using gin ((cast(properties->'announced_on_year' as integer)));

ERROR:  cannot cast type jsonb to integer

としても:

create index test1 on documents using gin (cast(properties->>'publication_year' as integer));

ERROR:  data type integer has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.`

この投稿http://www.postgresql.org/message-id/10736.1409063604@sss.pgh.pa.usから、これは可能であることがわかりましたが、正しい構文がわかりません。

簡単なインデックスを作成すると、次のようになります。

create index test1 on documents using gin ((properties->'publication_year'));

インデックスが作成されますが、範囲を取得するために整数値を使用してクエリを実行することはできません。

select count(*) from documents where properties->>'publication_year' = 2015;
ERROR:  operator does not exist: text = integer
LINE 1: ...*) from documents where properties->>'publication_year' = 2015;
                              ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

ヒントやヒントは大歓迎です。他の人も恩恵を受けると確信しています。ティア

4

4 に答える 4