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

オブジェクトのプロパティによってjsonまたはjsonb値内の配列内のオブジェクトを並べ替える方法は?

    オブジェクト内のキーの順序 jsonbで リテラルは重要ではありません-とにかくオブジェクトキーは内部的にソートされます。 (json この点で異なります。)参照:

    配列要素の順序 jsonbで (またはjson ただし、リテラルは重要です。あなたの要求は意味があります。次のように並べ替えることができます:

    SELECT jsonb_agg(elem)
    FROM  (
       SELECT *
       FROM   jsonb_array_elements(v_combined) a(elem)
       ORDER  BY (elem->>'ts')::int  -- order by integer value of "ts"
       ) sub;
    

    dbfiddle こちら

    しかし、それはより効率的でしょう 配列をに並べ替える 割り当てる:

    ...
    DECLARE
       v_combined      jsonb;
    BEGIN
       SELECT INTO v_combined  jsonb_agg(elem)
       FROM  (
          SELECT ts, json_agg(data_table_1) AS j
          FROM   data_table_1
          WHERE  fk_id = v_id
    
          UNION ALL 
          SELECT ts, json_agg(data_table_2)
          FROM   data_table_2
          WHERE  fk_id = v_id
          ORDER  BY ts
          ) sub;
    ...
    

    サブクエリからの行の順序

    標準SQLでは、行の順序 サブクエリ(または任意のテーブル式)でも重要ではありません。しかし、Postgresでは、サブクエリの行の順序は次のレベルに引き継がれます。したがって、これは単純なクエリで機能します。 文書化されています

    これに頼ることができない、または頼らない場合は、安全な代替手段があります。ORDER BYを追加します。 集計関数自体に。それはさらに短いです:

    SELECT INTO v_combined  jsonb_agg(elem  ORDER BY (elem->>'ts')::int)
    FROM   jsonb_array_elements(v_combined) a(elem);
    

    ただし、通常は遅い




    1. GROUP SEPARATORを使用したexplode()関数

    2. Javaを使用してMysqlからループで反復せずに単一行の結果をフェッチする

    3. S3とaws_s3を使用してPostgresデータをRDSにインポートします

    4. MySQLi接続が非常に遅いのはなぜですか?