Запросить столбец 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;