Разобрать JSON в PL SQL с плохим форматированием - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь разобрать JSON с плохо отформатированным кодом в таблицу sql, однако некоторые значения создают проблемы. База данных: oracle 19,2

Данные json:

Insert into r_data (id,data)values
(1,'{'"View":"100",
"Assignment Title":"Collect all snippets from the Library",
"Status":"In Progress",
"Active/Not Active":"Depends"}');

Мне нужен результат как:

View  Assignment_Title                   Status       Active_Not_Active
100   Collect all snippets from Library  In progress  Depends

Когда я пишу запрос,

select * from r_data x JSON_TABLE(x.data,'$',
COLUMNS (view NUMBER(10) PATH '$.view')

- для первого представления столбца выдает ошибку недопустимого идентификатора в представлении слова. Он отлично работает только для столбца Status, как, вероятно, его единственное слово, и поскольку представление является ключевым словом, оно создает проблему. Однако я не могу изменить эти имена и хочу, чтобы столбец отображался как представление, заголовок назначения как заголовок назначения и активный / не активный как Active_not_Active.

Как это можно сделать?

1 Ответ

2 голосов
/ 07 августа 2020

Основная проблема заключается в том, что view - это зарезервированное ключевое слово, и поэтому его нельзя использовать в качестве имени столбца (кроме как в двойных кавычках - чего лучше избегать). Вы хотели создать столбец с именем view из данных в вашем JSON - вот почему вы получили ошибку «неверный идентификатор».

Но в вашем коде есть множество других ошибок; если вы даже дошли до ошибки «недопустимый идентификатор», это означает, что опубликованный вами код - это , а не код, который вы запустили.

Например, даже в insert оператор, у вас есть дополнительная одинарная кавычка после открывающей скобки. Это означает, что открывающая скобка представляет собой строку (один символ), а остальное - неизвестно что. Мне пришлось удалить эту ошибочную одинарную кавычку, чтобы insert заработал. Как вы смогли использовать этот явно синтаксически неверный оператор?

В операторе select вам не хватает запятой после псевдонима x (перед ключевым словом JSON_TABLE). Ни в коем случае вы не получите ошибку «недопустимый идентификатор» с , что синтаксическая ошибка в коде.

В функции JSON_TABLE не должно быть запятой между '$' и COLUMNS пункт. С этой запятой вы получите другую ошибку, а не «недопустимый идентификатор» - поэтому я не верю, что то, что вы опубликовали, является вашим настоящим кодом.

Et c. Если все, что вы получили, это ошибка «неверный идентификатор», просто выберите другое имя для столбца (view не сработает) и посмотрите, что произойдет. Хотя ... есть еще одна ошибка, которая приведет к неожиданному результату. JSON чувствителен к регистру. Имя атрибута в JSON - View с большой буквы V. Поэтому вы должны ссылаться на него как на $.View в JSON_TABLE; у вас есть $.view, что не соответствует ни одному атрибуту в вашем JSON, поэтому вы получите null для этого столбца (если вы не измените его для соответствия заглавным буквам из JSON).

Вот полный пример со всеми исправленными ошибками.

Сначала создайте таблицу. Я делаю все за один шаг:

create table r_data (id,data) as select 1,'{"View":"100",
"Assignment Title":"Collect all snippets from the Library",
"Status":"In Progress",
"Active/Not Active":"Depends"}' from dual;

Затем вот запрос и его результат. Обратите внимание на двойные кавычки вокруг имен свойств со встроенными пробелами (и прямого sla sh, et c.).

select x.id, 
       j.view_, assignment_title, j.status, j.active_not_active 
from   r_data x,
       json_table(x.data,'$'
           columns (view_             number(10)   path '$.View',
                    assignment_title  varchar2(50) path '$."Assignment Title"',
                    status            varchar2(20) path '$.Status',
                    active_not_active varchar2(20) path '$."Active/Not Active"'
                   )
       ) j
;

ID VIEW_ ASSIGNMENT_TITLE                      STATUS      ACTIVE_NOT_ACTIVE 
-- ----- ------------------------------------- ----------- ------------------
 1   100 Collect all snippets from the Library In Progress Depends            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...