Обновление полей в JSON_ARRAY Mysql 8.0 - PullRequest
0 голосов
/ 03 февраля 2020

Вот мой сценарий, я хочу обновить hourly_rate для BOB до 600. Как извлечь hourly_rate из json_array, упомянутого ниже для указанного c user BOB.

@data = [{
 "Subject": "Maths",
 "type": "paid",
 "tutor": "MARY",
 "hourly_rate": "500"
},
{
 "Subject": "Maths",
 "type": "paid",
 "tutor": "BOB",
 "hourly_rate": "700"
}]

Могу ли я использовать JSON_SEARCH() для получения индекса с помощью Where Clause.

пример:

  "Select JSON_SET(@data,'$[*].hourly_rate', 600) Where 'Subject' = Maths and 'tutor' = 'BOB'";

1 Ответ

2 голосов
/ 03 февраля 2020

Я получил это работает. Но я должен был использовать view, чтобы получить более чистый код.

Мой ответ основан на этом: { ссылка }


Обновление запроса

Fiddle @ https://www.db-fiddle.com/f/7MnPYEJW2uiGYaPhSSjtKa/1

UPDATE test
  INNER JOIN getJsonArray ON getJsonArray.tutor = 'BOB'
SET test =
  JSON_REPLACE(
    test,
    CONCAT('$[', getJsonArray.rowid - 1, '].hourly_rate'), 600);

select * from test;    

Ddl

CREATE TABLE `test` (
  `test` json DEFAULT NULL
);

INSERT INTO `test` (`test`)
VALUES ('[{
 "Subject": "Maths",
 "type": "paid",
 "tutor": "MARY",
 "hourly_rate": "500"
},
{
 "Subject": "Maths",
 "type": "paid",
 "tutor": "BOB",
 "hourly_rate": "700"
}]');

create view getJsonArray as    
select data.* 
from   test, json_table(
  test,
         "$[*]"
         COLUMNS(
          rowid FOR ORDINALITY,
            Subject VARCHAR(100) PATH "$.Subject" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
            type VARCHAR(100) PATH "$.type" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
            tutor VARCHAR(100) PATH "$.tutor" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
            hourly_rate JSON PATH "$.hourly_rate" DEFAULT '{"x": 333}' ON EMPTY
         )
       ) data
      ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...