2017-07-13 26 views
0

postgresクエリを使用して、下のjson文字列から値を取得するにはどうすればよいですか?私はこれを行うために正規表現を使用していますが、より一般的な/簡単な/信頼できるクエリを何かを書こうとしています。はい、私は私が書いたことを信用しません。postgresを使用してJsonの文字列化された文字列からデータを取得

これは私が持っているものです。

SELECT 
trim(both '" 'FROM replace(regexp_replace('phone_data', '[\\] 
{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gpslogs' -> 0 ->> 'cataract' 
FROM 
    "JSON" 
WHERE 
    "ID" = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 

これは、データがどのように見えるかです:あなたの助けと提案に感謝

{ 
"glossary": { 
    "title": "example glossary", 
    "GlossDiv": { 
     "title": "S", 
     "GlossList": { 
      "GlossEntry": { 
       "ID": "SGML", 
       "SortAs": "SGML", 
       "GlossTerm": "Standard Generalized Markup Language", 
       "Acronym": "SGML", 
       "Abbrev": "ISO 8879:1986", 
       "GlossDef": { 
        "para": "A meta-markup language, used to create markup languages such as DocBook.", 
        "GlossSeeAlso": ["GML", "XML"] 
       }, 
       "GlossSee": "markup" 
      } 
     } 
    } 
} 

}

。ありがとう。

+0

PostgreSQLでregexesを使用してJSONを操作する必要はありません。 [PostgresにはJSONデータの検索と操作のためのJSON関数がたくさんあります](https://www.postgresql.org/docs/current/static/functions-json.html)。あなたはそのJSONから何を得ようとしていますか? – Schwern

+0

この例では、高度フィールドを入力したいとします。 – Anusha

+0

@Schwernも最初と二重引用符で余分な二重引用符を認識しました – Anusha

答えて

0

ダブルエンコードされたJSONデータがあるようです。すべての実際のJSONは大きな文字列値に分解され、エンコードを解除し、JSONとして解析し(JSONBのポイントを打ち負かす)、次に検索する必要があります。

ガーベッジデータを使用しないでください。代わりに、それを修正し、その結果得られたクリーンなデータで作業してください。これにより、すべての処理が高速化し、バグが少なくなり、メモリが少なくなり、プログラミング時間が大幅に短縮されます。

これは、JSONデータを修正するために単一のupdateを実行することを意味します。これを行うときにトランザクションを必ず実行して、間違えた場合にロールバックすることができます。また、インポータを変更して、入力データを挿入する前に修正する必要があります。最後に、JSONが不正であると想定する他のクエリがあるかもしれませんが、分かりやすいJSONで動作するように変更する必要があります。

次に、JSONB列を通常どおりクエリできます。

select phone_device_data->'objects'->0->'data'->'gps_location_logs'->0->>'latitude' 
from json_storage 
where id = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'; 
+0

いいえ、私のために動作しません。余分な引用符を削除してこれを試しましたか? – Anusha

+0

@Anushaあなたが奇妙なエスケープで投稿したその値が 'phone_device_data'カラムにある場合、データに非常に間違いがあります。無効なJSONを投稿しました。また、JSONBフィールドに無効なJSONを含めることはできません。私は 'phone_device_data'が実際にはJSONBではないか、それともエスケープされた巨大な文字列フィールドであるか、実際の値ではないものを投稿したと思われます。おそらく、id = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb'というどこかのjson_storageから 'select phone_device_dataを貼り付けてください。 – Schwern

+0

それはどういうものなのか私を信じてください。だから私は正規表現を使用した。 – Anusha

関連する問題