Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг джейсона в Oracle 12 / 12 сообщений из 12, страница 1 из 1
14.07.2017, 13:24
    #39489047
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
Просьба помощи от старших товарищей по цеху.
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
14.07.2017, 13:43
    #39489068
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
То есть, хочу, чтобы в результате получилось:
"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
14.07.2017, 15:52
    #39489179
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
Код: 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
14.07.2017, 16:01
    #39489188
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
SY,

Спасибо огромное! То, что нужно
...
Рейтинг: 0 / 0
14.07.2017, 16:16
    #39489203
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
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
14.07.2017, 16:29
    #39489218
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
Нет, 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
14.07.2017, 16:52
    #39489242
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
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
14.07.2017, 17:13
    #39489260
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
A!

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

SY.
...
Рейтинг: 0 / 0
14.07.2017, 17:43
    #39489282
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
SY,
авторПереходи на 12.2. Xотя и там куча JSON багов.
Позитив..) Спасибо за помощь!)
...
Рейтинг: 0 / 0
14.07.2017, 17:50
    #39489288
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
Хм, проверил на 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
14.07.2017, 17:58
    #39489293
AF_FM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
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
14.07.2017, 18:51
    #39489320
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг джейсона в Oracle 12
AF_FMМожет в этом дело....

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

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


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