WedX - журнал о программировании и компьютерных науках

Передача динамического ключа в JSON_VALUE() в Oracle

У меня есть столбец типа клуба, в котором есть данные Json. У меня есть около 100 ключей, которые уникальны для каждой записи. мы используем json_value('json_data', 'keyname'). В моем случае я не знаю фактического для этой записи. Поэтому мне нужно присоединиться к другой таблице, где определены ключи. Вместо имени ключа я хочу передать имя столбца. Это дает некоторую ошибку, говорящую:

Синтаксическая ошибка,
Ожидается: строка

Итак, кто-нибудь может предложить, как получить данные из столбца json, передав динамический ключ во время выполнения.

Допустим, у меня есть две таблицы table_1 и table_2. Table_1 имеет столбец с именем json_data_column, в котором хранятся данные в формате json. Table_1 имеет FK для TABLE_2, у которого есть ключ сопоставления. поэтому мы должны выяснить, каково значение этого динамического ключа каждой записи.

Если я даю любую статическую строку вместо t2.json_key , то она работает. Но при задании динамических значений это не работает.

РАБОТАЮЩИЙ

select
       json_value ( json_value (t1.json_data_column, '$.string'), '$.my_key' )
from TABLE_1 t1
       inner join TABLE_2 t2 on t1.json_key_fk = t2.id

НЕ РАБОТАЕТ

select
       json_value ( json_value (t1.json_data_column, '$.string'), t2.json_key )
from TABLE_1 t1
       inner join TABLE_2 t2 on t1.json_key_fk = t2.id

Набор данных:

{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}

{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"status\":\"COMPLETED\"}"}
17.03.2017

  • Можете ли вы опубликовать некоторые примеры данных? Это поможет нам визуализировать вашу проблему 17.03.2017

Ответы:


1

То, что вы пытаетесь сделать, не может напрямую поддерживаться архитектурой. По сути, мы настраиваем механизм JSON PATH, который ищет в каждой строке таблицы (документ в коллекции) набор путей, определенный во время компиляции инструкции. В вашем случае вы ожидаете, что мы будем работать с путем, который не может быть известен до тех пор, пока строка не будет получена.

в 12.2 (теперь это GA) мы можем использовать функции PL/SQL JSON для этого.

SQL> set lines 120 pages 0
SQL> with FUNCTION GET_NAME(P_JSON_DOC in VARCHAR2) RETURN VARCHAR2
  2  is
  3  begin
  4    return SUBSTR(P_JSON_DOC,INSTR(P_JSON_DOC,'"',1,5)+1,INSTR(P_JSON_DOC,'"',1,6)-INSTR(P_JSON_DOC,'"',1,5)-1);
  5  end;
  6  FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2
  7  is
  8    JO JSON_OBJECT_T;
  9  begin
 10    JO := JSON_OBJECT_T(P_JSON_DOC);
 11    return JO.get_STRING(P_KEY);
 12  end;
 13  MY_TABLE as (
 14    select COLUMN_VALUE JSON_DOC
 15      from TABLE(
 16             XDB$STRING_LIST_T(
 17               '{"string":"{\"id\":133100,\"data_found\":5,\"isActive\":\"true\",\"process\":\"completed\",\"status\"
:\"COMPLETED\"}"}',
 18               '{"string":"{\"id\":133100,\"data_found\":5,\"isDelete\":\"true\",\"process\":\"completed\",\"status\"
:\"COMPLETED\"}"}',
 19               '{"string":"{\"id\":133100,\"data_found\":5,\"isUnderProgress\":\"false\",\"process\":\"completed\",\"
status\":\"COMPLETED\"}"}',
 20               '{"string":"{\"id\":133100,\"data_found\":5,\"isSentToClient\":\"false\",\"process\":\"completed\",\"s
tatus\":\"COMPLETED\"}"}'
 21             )
 22           )
 23  )
 24  select GET_NAME(EMBEDDED_JSON),GET_KEY_VALUE(EMBEDDED_JSON,GET_NAME(EMBEDDED_JSON))
 25    from (
 26           select JSON_VALUE(JSON_DOC,'$.string') EMBEDDED_JSON
 27             from MY_TABLE
 28         )
 29  /
isActive
true

isDelete
true

isUnderProgress
false

isSentToClient
false


SQL>

В версии 12.1 функция GET_NAME может использовать EXECUTE IMMEDIATE.

FUNCTION GET_KEY_VALUE(P_JSON_DOC VARCHAR2, P_KEY VARCHAR2) RETURN VARCHAR2
is
  V_RESULT VARCHAR2(200);
begin
  EXECUTE IMMEDIATE 'select JSON_VALUE(:1,''$.' || P_KEY || ''') from dual' into V_RESULT using P_JSON_DOC;
  return V_RESULT;
end;
08.04.2017
  • Исправление: в Oracle 12.1 функция GET_KEY_VALUE (не GET_NAME) может использовать EXECUTE IMMEDIATE. поскольку JSON_OBJECT_T недоступен. Спасибо за этот ответ! Это очень помогло, так как мы все еще на 12.1. 15.06.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]