Как преобразовать значения строки таблицы оракула в формате JSON в несколько реляционных столбцов? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть таблица оракула, которая была загружена MQ, и один из столбцов таблицы имеет значения с данными формата JSON. Мне нужно преобразовать эти данные формата JSON в формат реляционных строк.Мне интересно, есть ли SQL в Oracle с / без создания временных таблиц для преобразования этих данных формата JSON в значения реляционных столбцов?

Select JSON_MG from test_1;

JSON_MG
{
  "type": "testeevnet",
  "version": "test-1.0",
  "testsource": "1.0.0",
  "timestamp": "2019-02-14T20:45:18.4422201+00:00",
  "test_ID": 11,
  "tag": "22",
  "PNAME": "test/test_n",
  "ticket": "WT9999",
  "ticketStatus": "active",
  "tickets": [
    {
      "ticket": "convert",
      "code": "PA",
      "date": "2019-03-31"
    }
    }
  ]
}

- ожидаемый результат для всех элементов JSON в виде столбцов

1 Ответ

0 голосов
/ 07 июня 2019

json_table - это то, что вы ищете. Это может сделать JSON -> реляционное преобразование.

Просто перечислите пути к элементам, которые вы хотите извлечь, и их тип данных:

with jdata as (
  select '{
  "type": "testeevnet",
  "version": "test-1.0",
  "testsource": "1.0.0",
  "timestamp": "2019-02-14T20:45:18.4422201+00:00",
  "test_ID": 11,
  "tag": "22",
  "PNAME": "test/test_n",
  "ticket": "WT9999",
  "ticketStatus": "active",
  "tickets": [
    {
      "ticket": "convert",
      "code": "PA",
      "date": "2019-03-31"
    }
  ]
}' doc
  from dual
)
  select t.* 
  from   jdata, json_table (
    doc, '$'
    columns (
      type    varchar2 path '$.type',
      version varchar2 path '$.version',
      nested  path '$.tickets[*]' 
      columns (
        ticket varchar2 path '$.ticket'
      )
    )
  ) t;

TYPE         VERSION    TICKET    
testeevnet   test-1.0   convert   

nested path разбивает элементы массива на строки. Поэтому, когда вы добавляете больше объектов в массив заявок, они становятся строками:

with jdata as (
  select '{
  "type": "testeevnet",
  "version": "test-1.0",
  "testsource": "1.0.0",
  "timestamp": "2019-02-14T20:45:18.4422201+00:00",
  "test_ID": 11,
  "tag": "22",
  "PNAME": "test/test_n",
  "ticket": "WT9999",
  "ticketStatus": "active",
  "tickets": [
    {
      "ticket": "convert",
      "code": "PA",
      "date": "2019-03-31"
    },
    {
      "ticket": "convert2",
      "code": "PA",
      "date": "2019-03-31"
    }
  ]
}' doc
  from dual
)
  select t.* 
  from   jdata, json_table (
    doc, '$'
    columns (
      type    varchar2 path '$.type',
      version varchar2 path '$.version',
      nested  path '$.tickets[*]' 
      columns (
        ticket varchar2 path '$.ticket'
      )
    )
  ) t;

TYPE         VERSION    TICKET     
testeevnet   test-1.0   convert     
testeevnet   test-1.0   convert2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...