PLSQL: удалите ненужные двойные кавычки в Json - PullRequest
0 голосов
/ 24 июня 2019

У меня есть такой Json (он содержится в переменной clob):

{"id": "33", "type": "abc", "val": "2", "cod": "", "sg1": "1", "sg2": "1"}
{"id": "359", "type": "abcef", "val": "52", "cod": "aa", "sg1": "", "sg2": "0"}
…

Мне нужно удалить " из значений: id, val, sg1, sg2

Возможно ли это?

Например, мне нужно получить это:

{"id": 33, "type": "abc", "val": 2, "cod": "", "sg1": 1, "sg2": 1}
{"id": 359, "type": "abcef", "val": 52, "cod": "aa", "sg1": , "sg2": 0}
…

1 Ответ

3 голосов
/ 24 июня 2019

Если вы используете Oracle 12 (R2?) Или более позднюю версию, вы можете преобразовать JSON в соответствующие типы данных и затем преобразовать его обратно в JSON.

Установка Oracle 18 :

CREATE TABLE test_data ( value CLOB );
INSERT INTO test_data ( value )
  VALUES ( '{"id": "33", "type": "abc", "val": "2", "cod": "", "sg1": "1", "sg2": "1"}' );
INSERT INTO test_data ( value )
  VALUES ( '{"id": "359", "type": "abcef", "val": "52", "cod": "aa", "sg1": "", "sg2": "0"}' );

Запрос :

SELECT JSON_OBJECT(
         'id'   IS j.id,
         'type' IS j.typ,
         'val'  IS j.val,
         'cod'  IS j.cod,
         'sg1'  IS j.sg1,
         'sg2'  IS j.sg2
       ) AS JSON
FROM   test_data t
       CROSS JOIN
       JSON_TABLE(
         t.value,
         '$'
         COLUMNS
           id  NUMBER(5,0) PATH '$.id',
           typ VARCHAR2(10) PATH '$.type',
           val NUMBER(5,0) PATH '$.val',
           cod VARCHAR2(10) PATH '$.cod',
           sg1 NUMBER(5,0) PATH '$.sg1',
           sg2 NUMBER(5,0) PATH '$.sg2'
       ) j

Выход :

| JSON                                                             |
| :--------------------------------------------------------------- |
| {"id":33,"type":"abc","val":2,"cod":null,"sg1":1,"sg2":1}        |
| {"id":359,"type":"abcef","val":52,"cod":"aa","sg1":null,"sg2":0} |

Или, если вы хотите использоватьрегулярные выражения (вы не должны делать это, если у вас есть выбор и вместо этого следует использовать правильный анализатор JSON):

Запрос 2 :

SELECT REGEXP_REPLACE(
         REGEXP_REPLACE(
           value,
           '"(id|val|sg1|sg2)": ""',
           '"\1": "null"'
         ),
         '"(id|val|sg1|sg2)": "(\d+|null)"',
         '"\1": \2'
       ) AS JSON
FROM   test_data

Вывод :

| JSON                                                                        |
| :-------------------------------------------------------------------------- |
| {"id": 33, "type": "abc", "val": 2, "cod": "", "sg1": 1, "sg2": 1}          |
| {"id": 359, "type": "abcef", "val": 52, "cod": "aa", "sg1": null, "sg2": 0} |

db <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...