Currently using MYSQL 5.7, soon to be migrating to 8.0. We have a json field in our database which has values which look like this:
x
[
{
"first_name":"bob",
"last_name":"lisserman"
},
{
"first_name":"bob",
"last_name":"rippleman"
},
{
"first_name":"joe",
"last_name":"roterlam"
}
]
I’m trying to write a query which finds records which contain an object in the array with both “first_name” = “bob” AND “last_name” = “rippleman”
Does JSON_CONTAINS
support a search like this?
Advertisement
Answer
12.17.3 Functions That Search JSON Values :: JSON_CONTAINS(target, candidate[, path]):
…
- A candidate object is contained in a target object if and only if for each key in the candidate there is a key with the same name in the target and the value associated with the candidate key is contained in the value associated with the target key.
…
MySQL 5.7 and MySQL 8.0 try:
SELECT
`id`,
`json_field`
FROM
`tbl_table`
WHERE
JSON_CONTAINS(`json_field`, '{"first_name": "bob", "last_name": "rippleman"}');
See dbfiddle.
MySQL 8.0 try:
SELECT
`tbl_table`.`id`,
`tbl_table`.`json_field`
FROM
`tbl_table`, JSON_TABLE(
`json_field`,
'$[*]'
COLUMNS(
`first_name` VARCHAR(50) PATH '$.first_name',
`last_name` VARCHAR(50) PATH '$.last_name'
)
) `der`
WHERE
`der`.`first_name` = 'bob' AND
`der`.`last_name` = 'rippleman';
See dbfiddle.