Oracle 12.1+ Обновить данные строки CLOB с нулевым значением - PullRequest
0 голосов
/ 18 июня 2020

Я использую Oracle 12.1+ БД, и со временем некоторые данные в моем table column COKE_INFO типа CLOB повреждаются.

Я исправил код java, чтобы этого не произошло, но для всех исторических данных я хочу установить для всех поврежденных данных значение null.

См. Описание таблицы

desc t_coke_ogn
Name                   Null     Type         
---------------------- -------- ------------ 
BOTTLE_CODE              NOT NULL VARCHAR2(30) 
COKE_INFO                            CLOB         
LAST_VERSION_CODE               VARCHAR2(30) 

См. Данные COKE_INFO.

 [
  {
    "type": {
      "label": "MIRINDA",
      "code": 15
    },
    "repeatedColumn": {
      "repeatedColumn": {
        "repeatedColumn": "Coke_1633795"
      }
    }
  }
]

repeated_column иногда повторяется где-то 10 раз, а иногда 2. Я хочу установить его на null, как показано ниже

[
  {
    "type": {
      "label": "MIRINDA",
      "code": 15
    },
    "repeatedColumn": null
  }
]

Не уверен, как продвигаться здесь

1 Ответ

1 голос
/ 18 июня 2020

Вы можете использовать функцию json_table() вместе со строковыми функциями regexp_replace() и replace():

SELECT replace(regexp_replace(coke_info, '[[:space:]]*'),rcol,'null') as coke_info
  FROM t_coke_ogn
 CROSS JOIN json_table(coke_info, '$.repeatedColumn[*]'
              COLUMNS (rcol VARCHAR2(4000) FORMAT JSON PATH '$'))

или для непосредственного обновления:

MERGE INTO t_coke_ogn t1
USING 
(
SELECT bottle_code , replace(regexp_replace(coke_info, '[[:space:]]*',''),rcol,'null') 
    as coke_info
  FROM t_coke_ogn
 CROSS JOIN json_table(coke_info, '$.repeatedColumn[*]'
              COLUMNS (rcol VARCHAR2(4000) FORMAT JSON PATH '$'))) t2
   ON (t2.bottle_code = t1.bottle_code)         
  WHEN MATCHED THEN 
UPDATE 
   SET t1.coke_info = t2.coke_info 

Демо

...