You can use JSON_TABLE()
(in MySQL > 8.0, scroll down for MySQL <= 5.7 solution).
You need to use the appropriate JSON selector:
Selector |
Description |
$ |
the current JSON document |
.key |
select value from the key |
[n] |
select element n from JSON array |
.* |
wildcard, all values of a JSON object, as an array |
[*] |
wildcard, all the values of a JSON array, as an array |
** |
wildcard, all paths that lead to a suffix |
So, if @j = '[2, 4, 5, 14]'
is your JSON array, then the query
SELECT *
FROM JSON_TABLE(@j,
"$[*]"
COLUMNS(Value INT PATH "$")
) data;
will get you the array contents as a table:
You can use this subquery in an UPDATE
to check whether your respective id
is in it:
UPDATE tab
SET status = 0
WHERE id in (SELECT *
FROM JSON_TABLE(@j, "$[*]" COLUMNS(Value INT PATH "$")) data
);
will get you the following:
id |
name |
color |
price |
status |
2 |
Samsung S9 |
White |
24000000 |
0 |
3 |
Oppo F5 |
Red |
7000000 |
1 |
4 |
Macbook |
Grey |
5000000 |
0 |
5 |
MSI GT 900 |
Black |
12000000 |
0 |
12 |
Iphone 11 Pro Max |
Green |
1800000 |
1 |
13 |
Nokia 6300 |
Blue |
1100000 |
1 |
14 |
IPad Mini |
White |
2000000 |
0 |
In case your JSON looks differently, you need to change the PATH in the JSON_TABLE()
call accordingly. For example:
SET @k = '{"id": [2, 4, 5, 14] }'
SELECT * FROM JSON_TABLE(@k, "$.id[*]" COLUMNS(Value INT PATH "$")) data;
or
SET @l = '{"outer": [{"id": 2} , {"id": 4}, {"id": 5}, {"id": 14}] }'
SELECT * FROM JSON_TABLE(@l, "$.outer[*]" COLUMNS(Value INT PATH "$.id")) data;
have the same result.
See this db<>fiddle.
For MySQL <= 5.7, JSON_TABLE()
is not available, but you can achieve the same using JSON_CONTAINS()
. Since JSON_CONTAINS()
needs a JSON as argument, you need to CONVERT()
or CAST()
your INTEGER
id to a CHAR
:
UPDATE tab
SET status = 0
WHERE JSON_CONTAINS(@j, CAST(id as CHAR(20)), '$');
See this db<>fiddle.