sql >> Databasteknik >  >> RDS >> Oracle

Analysera json genom json_table i Oracle 18

Du kan definiera funktionerna:

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

Använd sedan frågan:

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

Vilka utgångar:

ID ID_ORD NYCKEL VÄRDE 14442845174255;2187606199CODEONB2B3BB814442845174255;2187606199DORD25.04.2021

(Obs! SQL stöder inte ett dynamiskt antal kolumner så du måste ange ett fast antal kolumner som t.ex. key och value och ha utdata som rader snarare än kolumner.)

db<>spela här



  1. Få dagen från ett datum i PostgreSQL

  2. Vad betyder prefixet N i T-SQL-satser och när ska jag använda det?

  3. PG::ConnectionBad:fe_sendauth:inget lösenord tillhandahålls

  4. Hur man skriver en funktion som returnerar text eller heltalsvärden?