sql >> Database >  >> RDS >> Oracle

Ontleden json door json_table in orakel 18

U kunt de functies definiëren:

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;
/

Gebruik dan de vraag:

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

Welke uitgangen:

ID ID_ORD SLEUTEL WAARDE 14442845174255;2187606199CODEONB2B3BB814442845174255;2187606199DORD25.04.2021

(Opmerking:SQL ondersteunt geen dynamisch aantal kolommen, dus u moet een vast aantal kolommen opgeven, zoals key en value en de uitvoer als rijen hebben in plaats van kolommen.)

db<>viool hier



  1. Fix "ERROR 1136 (21S01):Kolomtelling komt niet overeen met waardetelling in rij 1" bij het invoegen van gegevens in MariaDB

  2. ORA-01882:tijdzone regio niet gevonden

  3. Inleiding tot het afhandelen van PL/SQL-uitzonderingen in Oracle Database

  4. SQL MIN() voor beginners