Запросить столбец JSON с массивом объекта в MySQL
У меня есть столбец json с последующим массивом:
[
{
"id": "24276e4b-de81-4c2c-84e7-eed9c3582a31",
"key": "id",
"type": "input",
},
{
"id": "e0ca5aa1-359f-4460-80ad-70445be49644",
"key": "name",
"type": "textarea",
}
]
Я попытался выполнить следующий запрос, чтобы получить строку с идентификатором 24276e4b-de81-4c2c-84e7-eed9c3582a31
в столбце документа, но не возвращает результаты:
select * from jobs WHERE document->'$[*].id' = "24276e4b-de81-4c2c-84e7-eed9c3582a31"
Кто-нибудь знает, как сделать правильный запрос?
Ответы
Ответ 1
Я использую mysql 5.7, поэтому JSON_CONTAINS можно легко использовать следующим образом:
SELECT JSON_CONTAINS(
'[{"id": "24av","name": "she"},{"id": "e0c2", "name": "another_she"}]',
JSON_OBJECT('id', "e0c2")
);
Ответ 2
Попробуйте вот так:
SELECT * FROM jobs WHERE document->'$[*].id' = json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31");
он работает для меня, и я думаю, что ударный путь более беттер:
SELECT * FROM jobs WHERE json_contains(document->'$[*].id', json_array("24276e4b-de81-4c2c-84e7-eed9c3582a31"));
На самом деле легко запомнить, что возвращаемое значение JSON_TYPE
, но не строка или что-то еще;
Ответ 3
Когда вы используете document->'$[*].id'
, он возвращает список всех свойств идентификатора с разделителями-запятыми. Это не будет равно значению только одной строки ID, если только в столбце document
не будет только один объект.
Вам нужно использовать JSON_SEARCH()
для поиска соответствующего элемента в пределах значения JSON.
SELECT *
FROM jobs
WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id');
Ответ 4
Может быть, это? @Barmar
SELECT * FROM jobs WHERE JSON_SEARCH(document, "one", "24276e4b-de81-4c2c-84e7-eed9c3582a31", NULL, '$[*].id') IS NOT NULL;