Есть ли способ сравнить массив из поля JSON с JSON_ARRAY в MySQL?

#mysql #sql #arrays #json #mysql-8.0

#mysql #sql #массивы #json #mysql-8.0

Вопрос:

Таблица MySQL contacts

У меня есть столбец типа JSON responses , содержимое которого

 {"1": ["Yes", "No", "Maybe"], "2": ["Yes"], "3": ""}
  

Я хотел бы знать, возможно ли в предложении SELECT -> WHERE определить, равен ли первый элемент JSON некоторому заданному массиву (он изменится).

Моя идея была примерно такой:

 WHERE contacts.responses->>'$."1"' = JSON_ARRAY('Yes','No','Maybe')
  

но это не работает (хотя, когда обе стороны сравнения включены в оператор SELECT, они отображаются одинаково — '["Yes", "No", "Maybe"]' ). Итак, есть ли какой-либо другой способ добиться этого?

Ответ №1:

В Mysql 8 есть множество функций, с которыми вы можете работать с типом данных JSON

И вы можете использовать JSON_EXTRACT для извлечения ваших данных из вашего json в столбце. Ваши данные, которые вы ввели в вопросе, являются объектом, и вы должны использовать $."1" , чтобы указать на него. Будьте осторожны с массивом, который вы должны использовать $[1] .

Ниже приведен пример ваших данных и, вероятно, вашего вывода.

 CREATE TABLE t1 (jdoc JSON);
INSERT INTO t1 VALUES('{"1": ["Yes", "No", "Maybe"], "2": ["Yes"], "3": ""}');
INSERT INTO t1 VALUES('{"1": ["YY", "XX", "Maybe"], "2": ["Yes"], "3": ""}');
INSERT INTO t1 VALUES('{"1": ["Yes", "Maybe"], "2": ["Yes"], "3": ""}');

select jdoc from t1 where JSON_EXTRACT(jdoc,'$."1"') = JSON_ARRAY('Yes','No','Maybe');
  

Комментарии:

1. попробуйте эту онлайн-демонстрацию

2. Можем ли мы провести подобное сравнение? Я имею в виду что-то JSON_EXTRACT(jdoc,'$."1"') like JSON_ARRAY('Yes','Maybe'); ? Здесь я хочу проверить, есть ли в JSON да и возможно , есть ли.

3. select jdoc from t1 where JSON_CONTAINS(jdoc,'["Yes", "Maybe"]','$."1"')