#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"')