Получить значение вложенного столбца JSON - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть следующее:

WITH json AS (  
   SELECT '{"date":"2019-02-14"
        ,"data":{"AAPL":{"open":"169.71","close":"170.80","high":"171.26","low":"169.38","volume":"21175371"}
               ,"MSFT":{"open":"106.31","close":"106.90","high":"107.29","low":"105.66","volume":"21621821"}}}' doc  
   FROM dual  
)  

SELECT jt1.*
FROM 
json j,  
json_table(j.doc, '$'
       COLUMNS
       CLOSE_DATE varchar2(200) PATH '$.date'
     , NESTED  PATH '$.data[*]'  COLUMNS (
       ticker varchar2(2000) PATH '$.*',
       NESTED PATH '$.*' COLUMNS
                     (                       
                        opn   VARCHAR2(2000) PATH '$.open',
                        clse  VARCHAR2(2000) PATH '$.close',
                        hgh   VARCHAR2(2000) PATH '$.high',
                        lows  VARCHAR2(2000) PATH '$.low',
                        volu  VARCHAR2(2000) PATH '$.volume'
                     )                   
                    )
                   ) jt1;

Возвращает все значения, кроме двух символов акций.Как я могу получить эти значения?Я использую ORACLE XE 18C

1 Ответ

0 голосов
/ 17 февраля 2019

С вашими данными вы можете flat извлечь оба биржевых символа в отдельных столбцах, названных в честь биржевого символа.

WITH json AS (  
   SELECT '{"date":"2019-02-14"
        ,"data":{"AAPL":{"open":"169.71","close":"170.80","high":"171.26","low":"169.38","volume":"21175371"}
               ,"MSFT":{"open":"106.31","close":"106.90","high":"107.29","low":"105.66","volume":"21621821"}}}' doc  
   FROM dual  
)  
SELECT jt1.*
FROM 
json j,  
json_table(j.doc, '$'
       COLUMNS 
       CLOSE_DATE varchar2(200) PATH '$.date'
     , NESTED  PATH '$.data'  COLUMNS (
       NESTED PATH '$.AAPL' COLUMNS
                     (                       
                        AAPL_opn   VARCHAR2(2000) PATH '$.open',
                        AAPL_clse  VARCHAR2(2000) PATH '$.close',
                        AAPL_hgh   VARCHAR2(2000) PATH '$.high',
                        AAPL_lows  VARCHAR2(2000) PATH '$.low',
                        AAPL_volu  VARCHAR2(2000) PATH '$.volume'
                     ) ,
       NESTED PATH '$.MSFT' COLUMNS
                     (                       
                        MSFT_opn   VARCHAR2(2000) PATH '$.open',
                        MSFT_clse  VARCHAR2(2000) PATH '$.close',
                        MSFT_hgh   VARCHAR2(2000) PATH '$.high',
                        MSFT_lows  VARCHAR2(2000) PATH '$.low',
                        MSFT_volu  VARCHAR2(2000) PATH '$.volume'
                     )                     
                    )
                   ) jt1;

Но это не будет масштабироваться для большего количестваданные.Вы, вероятно, хотите, чтобы массив содержал фондовый символ в нем.

Обратите внимание на измененные данные JSON

WITH json AS (  
   SELECT '{"date":"2019-02-14"
        ,"data":[{"ticker":"AAPL","open":"169.71","close":"170.80","high":"171.26","low":"169.38","volume":"21175371"}
               , {"ticker":"MSFT","open":"106.31","close":"106.90","high":"107.29","low":"105.66","volume":"21621821"}]}' doc  
   FROM dual  
)  

SELECT jt1.*
FROM 
json j,  
json_table(j.doc, '$'
       COLUMNS (
       CLOSE_DATE varchar2(200) PATH '$.date'
     , NESTED  PATH '$.data[*]'  COLUMNS 
                     (  ticker VARCHAR2(2000) PATH '$.ticker',                      
                        opn   VARCHAR2(2000) PATH '$.open',
                        clse  VARCHAR2(2000) PATH '$.close',
                        hgh   VARCHAR2(2000) PATH '$.high',
                        lows  VARCHAR2(2000) PATH '$.low',
                        volu  VARCHAR2(2000) PATH '$.volume'
                     ) 
                    ) 
                   ) jt1;

результат

CLOSE_DATE           TICKER               OPN                  CLSE                 HGH                  LOWS                 VOLU               
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
2019-02-14           AAPL                 169.71               170.80               171.26               169.38               21175371             
2019-02-14           MSFT                 106.31               106.90               107.29               105.66               21621821         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...