sql >> Databáze >  >> RDS >> Oracle

Analyzujte json prostřednictvím json_table v oracle 18

Můžete definovat funkce:

CREATE FUNCTION get_keys(
  value IN CLOB
) RETURN SYS.ODCIVARCHAR2LIST PIPELINED
IS
  js   JSON_OBJECT_T := JSON_OBJECT_T( value );
  keys JSON_KEY_LIST;
BEGIN
  keys := js.get_keys();
  FOR i in 1 .. keys.COUNT LOOP
    PIPE ROW ( keys(i) );
  END LOOP;
END;
/

CREATE FUNCTION get_value(
  value IN CLOB,
  path  IN VARCHAR2
) RETURN VARCHAR2
IS
  js JSON_OBJECT_T := JSON_OBJECT_T( value );
BEGIN
  RETURN js.get_string( path );
END;
/

Poté použijte dotaz:

WITH j (sJson) as (
   select '{
      "ID":"1444284517",
      "ID_ORD":"4255;2187606199",
      "Vals":{
               "CODE":"ONB2B3BB8",
               "DORD":"25.04.2021"
             }
   }'
   from dual
)
SELECT jt.id,
       jt.id_ord,
       k.COLUMN_VALUE AS Key,
       get_value( jt.vals, k.COLUMN_VALUE ) AS value
FROM   j
       CROSS APPLY JSON_TABLE(
         j.sjson,
         '$'
         COLUMNS (
           id     VARCHAR2(20) PATH '$.ID',
           id_ord VARCHAR2(30) PATH '$.ID_ORD',
           vals   VARCHAR2(4000) FORMAT JSON PATH '$.Vals'
         )
       ) jt
       CROSS APPLY get_keys( jt.vals ) k

Které výstupy:

ID ID_ORD KEY VALUE 14442845174255;2187606199CODEONB2B3BB814442845174255;2187606199DORD25.04.2021

(Poznámka:SQL nepodporuje dynamický počet sloupců, takže musíte zadat pevný počet sloupců, jako je key a value a mít výstup jako řádky, nikoli sloupce.)

db<>zde hrajte



  1. jak vložit aktuální datum do pole DATE ve formátu dd/mm/rrrr v oracle

  2. STR_TO_DATE() Příklady – MySQL

  3. Jaký je nejrychlejší způsob hromadného vkládání do Postgresu?

  4. mysql:získat počet záznamů mezi dvěma datum-čas