Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przeanalizuj json przez json_table w Oracle 18

Możesz zdefiniować funkcje:

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

Następnie użyj zapytania:

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

Które wyjścia:

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

(Uwaga:SQL nie obsługuje dynamicznej liczby kolumn, więc musisz podać stałą liczbę kolumn, np. key i value i otrzymaj wynik w postaci wierszy, a nie kolumn).

db<>graj tutaj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wygenerować (lub pobrać) skrypt ddl na istniejącej tabeli w Oracle? Muszę je odtworzyć w Hive

  2. podzapytanie skalarne w instrukcji if Warunek w PL/SQL

  3. Zmiany w Grupie Serwisowej w R12.2

  4. Funkcje o wartościach tabelarycznych w ORACLE 11g ? ( widoki parametryczne )

  5. Jaka jest dokładnie różnica między indeksem pierwotnym a indeksem wtórnym?