powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг джейсона в Oracle 12
12 сообщений из 12, страница 1 из 1
Парсинг джейсона в Oracle 12
    #39489047
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просьба помощи от старших товарищей по цеху.
Oracle Database 12c Release 12.1.0.2.0

Есть ли способ, используя JSON_TABLE или еще каким другим способом решить следующую задачу:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with jsn as
(
select 
  1 as id, 
  '[{"choice_items":[{"type":"formula","value":"a+b","prod":[11725,10314,12008]},{"type":"formula","value":"c+d","prod":[10179,10080]}],"condition":"a == 0"},{"choice_items":[{"type":"formula","value":"z+x","prod":[11134]},{"type":"order","city":105}],"condition":"x == 0"}]' as j
from dual
)

select 
  js.id,
  row_number() over (partition by js.id order by js.id) as rn,
  nvl(t1.type_choice,'condition') type_choice,
  t1.formula formula,
  t1.city city,
  t1.prod prod,
  t1.condition condition
from jsn js,
json_table
(
  js.j, '$[*]' columns 
  ( 
    nested path '$."choice_items"[*]'
    columns 
    (
      type_choice varchar2 path '$."type"',
      city number path '$."city"',
      formula varchar2 path '$."value"',
      nested path'$."prod"[*]' columns (prod number path '$')
    ),
    nested path '$."condition"' columns 
    (
      condition varchar2 path '$'
    )
  )
) t1



результат:

"ID""RN""TYPE_CHOICE""FORMULA""CITY""PROD""CONDITION"11"formula""a+b"1172512"formula""a+b"1031413"formula""a+b"1200814"formula""c+d"1017915"formula""c+d"1008016"condition""a == 0"17"formula""z+x"1113418"order"10519"condition""x == 0"

есть данная выборка. Существует ли способ проставить кондишн1, условно, для первого чейса (где rn c 1 по 6 строку в данном примере), а кондишн2 для второго (где rn c 7 по 9 строку) ?
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489068
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, хочу, чтобы в результате получилось:
"ID""RN""TYPE_CHOICE""FORMULA""CITY""PROD""CONDITION"11"formula""a+b"11725"a == 0"12"formula""a+b"10314"a == 0"13"formula""a+b"12008"a == 0"14"formula""c+d"10179"a == 0"15"formula""c+d"10080"a == 0"16"condition""""a == 0"17"formula""z+x"11134"x == 0"18"order"""105"x == 0"19"condition""""x == 0"
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489179
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
with jsn as
(
select
  1 as id,
  '[{"choice_items":[{"type":"formula","value":"a+b","prod":[11725,10314,12008]},{"type":"formula","value":"c+d","prod":[10179,10080]}],"condition":"a == 0"},{"choice_items":[{"type":"formula","value":"z+x","prod":[11134]},{"type":"order","city":105}],"condition":"x == 0"}]' as j
from dual
)
select
  js.id,
  row_number() over (partition by js.id order by js.id) as rn,
  nvl(t1.type_choice,'condition') type_choice,
  t1.formula formula,
  t1.city city,
  t1.prod prod,
  max(t1.condition) over(partition by n) condition
from jsn js,
json_table
(
  js.j, '$[*]' columns
  (
    n for ordinality,
    nested path '$."choice_items"[*]'
    columns
    (
      type_choice varchar2 path '$."type"',
      city number path '$."city"',
      formula varchar2 path '$."value"',
      nested path'$."prod"[*]' columns (prod number path '$')
    ),
    nested path '$."condition"' columns
    (
      condition varchar2 path '$'
    )
  )
) t1
/

        ID         RN TYPE_CHOIC FORMULA          CITY       PROD CONDITION
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          1 formula    a+b                        11725 a == 0
         1          2 formula    a+b                        10314 a == 0
         1          3 formula    a+b                        12008 a == 0
         1          4 formula    c+d                        10179 a == 0
         1          5 formula    c+d                        10080 a == 0
         1          6 condition                                   a == 0
         1          7 formula    z+x                        11134 x == 0
         1          8 order                        105            x == 0
         1          9 condition                                   x == 0

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489188
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Спасибо огромное! То, что нужно
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489203
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

При запуске у себя обнаружил, что n = rn -> достичь желаемого результата не удалось, из-за чего такое может быть?
"ID""RN""TYPE_CHOICE""FORMULA""CITY""PROD""CONDITION""N"11"formula""a+b"11725""112"formula""a+b"10314""213"formula""a+b"12008""314"formula""c+d"10179""415"formula""c+d"10080""516"condition""""a == 0"617"formula""z+x"11134""718"order"""105""819"condition""""x == 0"9
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489218
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, n != rn. Похоже ты n нетуда воткнул. Да и твой rn недетерминирован посколько у всех производных строк будет id родителя:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
with jsn as
(
select
  1 as id,
  '[{"choice_items":[{"type":"formula","value":"a+b","prod":[11725,10314,12008]},{"type":"formula","value":"c+d","prod":[10179,10080]}],"condition":"a == 0"},{"choice_items":[{"type":"formula","value":"z+x","prod":[11134]},{"type":"order","city":105}],"condition":"x == 0"}]' as j
from dual
)
select
  js.id,
  row_number() over (partition by js.id order by js.id) as rn,
  n,
  nvl(t1.type_choice,'condition') type_choice,
  t1.formula formula,
  t1.city city,
  t1.prod prod,
  max(t1.condition) over(partition by n) condition
from jsn js,
json_table
(
  js.j, '$[*]' columns
  (
    n for ordinality,
    nested path '$."choice_items"[*]'
    columns
    (
      type_choice varchar2 path '$."type"',
      city number path '$."city"',
      formula varchar2 path '$."value"',
      nested path'$."prod"[*]' columns (prod number path '$')
    ),
    nested path '$."condition"' columns
    (
      condition varchar2 path '$'
    )
  )
) t1
/

        ID         RN          N TYPE_CHOIC FORMULA          CITY       PROD CONDITION
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          1          1 formula    a+b                        11725 a == 0
         1          2          1 formula    a+b                        10314 a == 0
         1          3          1 formula    a+b                        12008 a == 0
         1          4          1 formula    c+d                        10179 a == 0
         1          5          1 formula    c+d                        10080 a == 0
         1          6          1 condition                                   a == 0
         1          7          2 formula    z+x                        11134 x == 0
         1          8          2 order                        105            x == 0
         1          9          2 condition                                   x == 0

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489242
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Хоть убей, не понимаю, почему у вас n = 1,2, я скопировал запрос и вставил в девелопер, у меня n от 1 до 9..(
Задачу в конечном счете я решил, чуть переделав запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with jsn as
(
select
  1 as id,
  '[{"choice_items":[{"type":"formula","value":"a+b","prod":[11725,10314,12008]},{"type":"formula","value":"c+d","prod":[10179,10080]}],"condition":"a == 0"},{"choice_items":[{"type":"formula","value":"z+x","prod":[11134]},{"type":"order","city":105}],"condition":"x == 0"}]' as j
from dual
)
select
  js.id,
  row_number() over (partition by js.id order by js.id) as rn,
  nvl(t1.type_choice,'condition') type_choice,
  t1.formula formula,
  t1.city city,
  t1.prod prod,
  t1.condition  
from jsn js,
json_table
(
  js.j, '$[*]' columns
  (
    nested path '$."choice_items"[*]'
    columns
    (
      type_choice varchar2 path '$."type"',
      city number path '$."city"',
      formula varchar2 path '$."value"',
      nested path'$."prod"[*]' columns (prod number path '$')
    ),
[color=yellow]    condition varchar2 path '$."condition"'[/color]
  )
) t1



Но вопрос, почему у меня for ordinality сработал не так, как у вас, остался открытым..
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489260
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A!

Пропустил ты на 12.1. Там по JSON куча багов. Переходи на 12.2. Xотя и там куча JSON багов.

SY.
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489282
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
авторПереходи на 12.2. Xотя и там куча JSON багов.
Позитив..) Спасибо за помощь!)
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489288
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, проверил на 12.1.0.2.0 - работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
SQL> select banner from v$version
  2  /

BANNER
--------------------------------------------------------------------------------
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
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

SQL> with jsn as
  2  (
  3  select
  4    1 as id,
  5    '[{"choice_items":[{"type":"formula","value":"a+b","prod":[11725,10314,12008]},{"type":"formula","value":"c+d","prod":[10179,1
0080]}],"condition":"a == 0"},{"choice_items":[{"type":"formula","value":"z+x","prod":[11134]},{"type":"order","city":105}],"conditio
n":"x == 0"}]' as j
  6  from dual
  7  )
  8  select
  9    js.id,
 10    row_number() over (partition by js.id order by js.id) as rn,
 11    n,
 12    nvl(t1.type_choice,'condition') type_choice,
 13    t1.formula formula,
 14    t1.city city,
 15    t1.prod prod,
 16    max(t1.condition) over(partition by n) condition
 17  from jsn js,
 18  json_table
 19  (
 20    js.j, '$[*]' columns
 21    (
 22      n for ordinality,
 23      nested path '$."choice_items"[*]'
 24      columns
 25      (
 26        type_choice varchar2 path '$."type"',
 27        city number path '$."city"',
 28        formula varchar2 path '$."value"',
 29        nested path'$."prod"[*]' columns (prod number path '$')
 30      ),
 31       nested path '$."condition"' columns
 32       (
 33         condition varchar2 path '$'
 34       )
 35    )
 36  ) t1
 37  /

        ID         RN          N TYPE_CHOIC FORMULA          CITY       PROD CONDITION
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          1          1 formula    a+b                        11725 a == 0
         1          2          1 formula    a+b                        10314 a == 0
         1          3          1 formula    a+b                        12008 a == 0
         1          4          1 formula    c+d                        10179 a == 0
         1          5          1 formula    c+d                        10080 a == 0
         1          6          1 condition                                   a == 0
         1          7          2 formula    z+x                        11134 x == 0
         1          8          2 order                        105            x == 0
         1          9          2 condition                                   x == 0

9 rows selected.

SQL> 



Так-что непонятно что-там у тебя не так.

SY.
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489293
AF_FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

у меня
BANNER
--------------------------------------------------------------------------------
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
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production


Может в этом дело....
...
Рейтинг: 0 / 0
Парсинг джейсона в Oracle 12
    #39489320
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AF_FMМожет в этом дело....

Скорее в патчах. Я только сейчас вспомнил что накатывал патчи 24345625 и 20885778. Там есть исправления по багам JASON.

SY.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг джейсона в Oracle 12
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]