2016-09-02 7 views
1

У меня есть столбец CLOB со следующими данными (упрощенным для целей данного вопроса)Как выбрать определенный элемент из массива JSON в оракулы JSON типа CLOB

{ 
    "notUsed": [], 
    "stock": [ 
     { 
      "name": "eggs", 
      "value": "in stock" 
     }, 
     { 
      "name": "milk", 
      "value": "out of stock" 
     } 
    ] 
} 

Я хочу, чтобы избежать необходимости, чтобы выбрать весь объект и проанализировать программно, чтобы получить нужные данные. В идеале я хотел бы использовать функции Oracle JSON path для этого.

Я хочу получить "value", где "name" = "eggs"

Я попытался следующие, но получить [99999][40442] ORA-40442: JSON path expression syntax error. Я запустить приведенный выше пример JSON, и путь JSON через evaluator и возвращает желаемый результат, который заставляет меня думать, что Oracle имеет собственный JSONPath intepretation

SELECT 
    json_query(
       '{"notUsed":[],"stock":[{"name":"eggs","value":"in stock"}, {"name":"milk","value":"out of stock"}]}', 
       '$.stock[?(@.name=="eggs")]') 
FROM dual; 

Я также попытался с помощью Dot Notation, но не смог найти пример, который охватывает добавление предложения where в свойства массива.

select 
    myTable.id, 
    myTable.JSON_COLUMN.stock -- how to get array element here? 
from MY_TABLE myTable 
where j.id = 46 

Версия:

SELECT * FROM V$VERSION 

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production 
"CORE 12.1.0.2.0 Production" 

ответ

3

JSON_path_expression поддерживает только некоторые базовые синтаксис, согласно the manual:

JSON_path_expression :: =

enter image description here

object_step :: =

enter image description here

array_step :: =

enter image description here

Альтернативный подход заключается в использовании JSON_TABLE для преобразования JSON в реляционную таблицу, а затем проект и фильтровать столбцы.

select value 
from json_table(
    '{ 
     "notUsed": [], 
     "stock": [ 
      { 
       "name": "eggs", 
       "value": "in stock" 
      }, 
      { 
       "name": "milk", 
       "value": "out of stock" 
      } 
     ] 
    }', 
    '$.stock[*]' 
    columns 
    (
     name varchar2(100 char) path '$.name', 
     value varchar2(100 char) path '$.value' 
    ) 
) 
where name = 'eggs' 

Результаты:

VALUE 
----- 
in stock