mariadb 修改存储为JSON的列数据

xjreopfe  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(131)

假设我有一个json列作为JSON_COLUMN,其中我以下面的格式存储数据

表格结构:(仅限2列)

ID - Autoincrement

JSON_COLUMN - Varchar2(1000)

字符串

样本数据

ID : 1

JSON_COLUMN :

[
   {
      "Name":"Number",
      "Id":"PhoneNumber",
      "Value":"+393123456789"
   },
   {
      "Name":"Name",
      "Id":"FirstName",
      "Value":"John"
   },
   {
      "Name":"City",
      "Id":"CityID",
      "Value":"NYC"
   }
]


现在,我想更新mariadb的查询,它应该取代城市从纽约到卡利的值
update tablename set JSON_COLUMN =?* 不确定这里要保存什么where id = 1;

eiee3dmh

eiee3dmh1#

这里有一个解决方案,它只更新数组中与键'Value'对应的'NYC'。

with cte as (
  select ID, j.* from tablename
  cross join json_table(JSON_COLUMN, '$[*]' columns(
    ord for ordinality, 
    Value varchar(100) path '$.Value')
  ) as j 
  where j.Value = 'NYC'
) 
update tablename cross join cte
set tablename.json_column = json_set(json_column, concat('$[', cte.ord-1, '].Value'), 'CALI')
where cte.id = tablename.id;

字符串
这在MySQL 8.0或更高版本中有效,但在MariaDB中无效,因为MariaDB不支持update之前的公共表表达式。
演示:https://dbfiddle.uk/tN9Q9-Od
以下是MariaDB 10.6或更高版本的解决方案(不适用于旧版本):

update tablename
cross join (
  select ID, j.* from tablename
  cross join json_table(JSON_COLUMN, '$[*]' columns(
    ord for ordinality,
    Value varchar(100) path '$.Value')
  ) as j
  where j.Value = 'NYC'
) as t
set tablename.json_column = json_set(json_column, concat('$[', t.ord-1, '].Value'), 'CALI');


演示:https://dbfiddle.uk/fKHp8BmZ

hgb9j2n6

hgb9j2n62#

mysql和mariadb没有数据类型varchar 2,但oracle有。
使用简单的REPLACE可以帮助您。
如果在json中只有一个NYC,这就足够了。

CREATE TABLE mytable (ID  int  Auto_increment primary key,

JSON_COLUMN  Varchar(1000))
INSERT INTO mytable VALUES (NULL,'[
   {
      "Name":"Number",
      "Id":"PhoneNumber",
      "Value":"+393123456789"
   },
   {
      "Name":"Name",
      "Id":"FirstName",
      "Value":"John"
   },
   {
      "Name":"City",
      "Id":"CityID",
      "Value":"NYC"
   }
]')
UPDATE mytable SET JSON_COLUMN = REPLACE(JSON_COLUMN,'NYC','CALI') WHERE ID = 1
Rows matched: 1  Changed: 1  Warnings: 0
SELECT * FROM mytable

| ID| JSON_列|
| --|--|
| 1 |的   {      “名称”:“编号”,      “Id”:“电话号码”,      电话:+393123456789   },   {      “名称”:“名称”,      “Id”:“FirstName”,      “价值”:“约翰”   },   {      “名称”:“城市”,      “Id”:“CityID”,      “Value”:“卡利”   }]的一种|
fiddle
如果您知道索引,则可以使用JSON_REPLACE

UPDATE mytable 
  SET JSON_COLUMN = JSON_REPLACE(JSON_COLUMN,'$[2].Value','CALI') WHERE ID = 1
Rows matched: 1  Changed: 1  Warnings: 0
SELECT JSON_EXTRACT(JSON_COLUMN,'$[2].Value') FROM mytable

| JSON_EXTRACT(JSON_COLUMN,'$[2]. Value ')|
| --|
| “卡利”|
fiddle

相关问题