sql >> データベース >  >> RDS >> PostgreSQL

JSONタイプの列をグループ化/選択する方法(PG ::UndefinedFunction:エラー:タイプjsonの等価演算子を識別できませんでした)

    残念ながら、直接jsonを実行する簡単な方法はありません。 9.3の同等性テスト。

    9.3のjson typeは、重複キーを持つjsonを受け入れるため(多くの実装で予想されるように)、等式演算子はありません。 {"a":1, "a":2}かどうかは不明です {"a":1}と「等しい」 かどうか。

    9.4はjsonbを追加します これは、重複キーをラストキーウィンベースで折りたたむため、平等が明確になります。

    regress=# SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
    ERROR:  operator does not exist: json = json
    LINE 1: SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
                                          ^
    HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
    
    regress=# SELECT '{"a":1, "a":2}'::jsonb = '{"a":1}'::jsonb;
     ?column? 
    ----------
     f
    (1 row)
    

    残念ながら、これは9.3では単純にやりたいことができないことを意味します。

    jsonのカスタム等式演算子を作成できます -おそらく両方をテキストにキャストしてそのように比較するだけですが、それは{"a":1, "b":2}を扱います および{"b":2, "a":1} 不平等として。

    より良いオプションは、PL / V8をインストールし、V8JavaScriptエンジンのjson操作を使用して等価比較を実行することです。

    jsonの等式演算子を定義します 、次に、その演算子を使用して単純なbツリーopclassを定義します。どちらもSQLレベルで簡単に実行できます。CREATE OPERATORを参照してください。 およびCREATE OPERATOR CLASS

    それが完了すると、GROUP BYできるようになります 9.3のjson値。

    または、9.4beta1をインストールしてjsonbを使用することもできます 。



    1. QUARTER()の例– MySQL

    2. 列のDjangoDBレベルのデフォルト値

    3. 列はnull延期可能ではありません

    4. SQL:クエリを中断する