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

PL/SQLを使用したCLOBフィールドからのJSONデータの解析

    CLOB 使用しているフィールドは有効なJSONではないため、JSON関数を直接使用することはできません。 JSONドキュメント を確認する必要があります そして、jsonを使いやすくするために、データベーステーブルにjsonを格納する方法を理解します。解決策の1つは、最初に個々のjsonを解析してから、JSON_OBJECTを適用することです。 各jsonで。さらに、PIVOTが必要になります またはMAX(CASE) ブロックして行を列に変換します。このクエリはOracle12c以降で機能します。

    サンプルデータ

    CREATE TABLE t AS 
      SELECT 1   AS id, 
             To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct" }, {   "key" : "PRODUCT_TYPE",   "value" : "Electronics" }, {   "key" : "PRODUCT_PRICE",   "value" : "123456789.1" }') AS j 
      FROM   dual 
      UNION ALL 
      SELECT 2, 
             To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct2" }, {   "key" : "PRODUCT_TYPE",   "value" : "Chemical" }, {   "key" : "PRODUCT_PRICE",   "value" : "25637.1" }') 
      FROM   dual; 
    

    クエリ

    WITH jdt AS 
    ( 
           SELECT id, 
                  JSON_VALUE(jsons,'$.key')   AS k,  -- gets the "key"
                  JSON_VALUE(jsons,'$.value') AS v   -- gets the "value"
           FROM   ( 
                         SELECT id, 
                                REGEXP_SUBSTR(j,'(.*?)\}(,|$)',1,LEVEL,'n',1) 
                                       || '}' AS jsons --split the clob field into individual jsons
                         FROM   t 
                                CONNECT BY PRIOR id = id 
                         AND    PRIOR SYS_GUID() IS NOT NULL 
                         AND    LEVEL <= REGEXP_COUNT(j,'\}(,|$)') ) ) 
    SELECT * 
    FROM   jdt pivot ( max ( v ) FOR k IN ( 'PRODUCT_NAME', 
                                           'PRODUCT_TYPE', 
                                           'PRODUCT_PRICE' ) );
    
     ID PRODUCT_NAME PRODUCT_TYPE   PRODUCT_PRICE
     1  Myproduct    Electronics    123456789.1
     2  Myproduct2   Chemical       25637.1
    


    1. 解析されたxmlファイルをAndroidのsqliteデータベースに保存する方法は?

    2. MySQLで多対多の階層構造を実装する方法

    3. MySQL:SQLエラー:1140、SQLState:42000

    4. 1つのSQLコマンドでテーブルを更新し、更新された行を表示します