Как запросить таблицу oracle со столбцом json в виде таблицы и агрегированных значений

#oracle

Вопрос:

У меня есть таблица данных в базе данных oracle с одним столбцом json blob. Данные представлены в следующей структуре json.

 {
  "type_a": [
    {
      "line_item_a": {
        "cost": 1284,
        "discount": null
      },
      "line_item_b": {
        "cost": 1284,
        "discount": null
      },
      "line_item_c": {
        "cost": 1284,
        "discount": null
      },
      "line_item_d": {
        "cost": 1284,
        "discount": null
      }
    }
  ],
  "type_b": [
    {
      "line_item_a": {
        "cost": 1284,
        "discount": null
      },
      "line_item_b": {
        "cost": 1284,
        "discount": null
      },
      "line_item_c": {
        "cost": 1284,
        "discount": null
      },
      "line_item_d": {
        "cost": 1284,
        "discount": null
      }
    }
  ],
  "type_c": [
    {
      "line_item_a": {
        "cost": 1284,
        "discount": null
      },
      "line_item_b": {
        "cost": 1284,
        "discount": null
      },
      "line_item_c": {
        "cost": 1284,
        "discount": null
      },
      "line_item_d": {
        "cost": 1284,
        "discount": null
      }
    }
  ],
  "customerId": "8E7A44BA8CE6BF76D09497246C5246FB",
  "priceType": {
    "id": 1,
    "selected": false,
    "text": "Corporate"
  }
}
 

Я пытаюсь прочитать значения в этом столбце со следующей структурой;

строка_итем_а line_item_b line_item_c
стоимость(тип_а) стоимость(тип_в) стоимость(тип_с) стоимость(тип_а) стоимость(тип_в) стоимость(тип_с) стоимость(тип_а) стоимость(тип_в) стоимость(тип_с)

Не могли бы вы, пожалуйста, помочь мне сформулировать запрос для этого?

Комментарии:

1. Формула одинакова для всех столбцов. Это опечатка? Вам нужен фиксированный вывод (a, b и c, несмотря на наличие d, для примера)?

Ответ №1:

Ну, это не изящное решение, но вот очень простой способ сделать это с помощью JSON_TABLE.

Предполагая, что ваша таблица называется MY_TABLE с json blob col JSON_COL.

 select jt.customer_id, 
    (li_a_type_a   li_a_type_b   li_a_type_c) as line_item_a,
    (li_b_type_a   li_b_type_b   li_b_type_c) as line_item_b,
    (li_c_type_a   li_c_type_b   li_c_type_c) as line_item_c 
from my_table t
cross join json_table(t.json_col, '


Комментарии:

1. спасибо @kfinity; это хороший прогресс. что мне делать, если номер позиции не фиксирован?

COLUMNS (
customer_id varchar2(50 char) PATH '$.customerId',
li_a_type_a number PATH '$.type_a.line_item_a.cost',
li_b_type_a number PATH '$.type_a.line_item_b.cost',
li_c_type_a number PATH '$.type_a.line_item_c.cost',
li_d_type_a number PATH '$.type_a.line_item_d.cost',
li_a_type_b number PATH '$.type_b.line_item_a.cost',
li_b_type_b number PATH '$.type_b.line_item_b.cost',
li_c_type_b number PATH '$.type_b.line_item_c.cost',
li_d_type_b number PATH '$.type_b.line_item_d.cost',
li_a_type_c number PATH '$.type_c.line_item_a.cost',
li_b_type_c number PATH '$.type_c.line_item_b.cost',
li_c_type_c number PATH '$.type_c.line_item_c.cost',
li_d_type_c number PATH '$.type_c.line_item_d.cost'
)) as jt
;

Комментарии:

1. спасибо @kfinity; это хороший прогресс. что мне делать, если номер позиции не фиксирован?