Изменение порядка, в котором предложения разбивают запрос - PullRequest
4 голосов
/ 12 марта 2020

Я столкнулся с этим делом, используя MySQL 5.6:

Этот запрос работает и возвращает ожидаемые результаты:

select *
from some_table
where a = 'b'
and metadata->>"$.country" is not null;

Однако этот запрос (единственная разница - это порядок пункты) возвращает ошибку

select *
from some_table
where metadata->>"$.country" is not null
and a = 'b';

Ошибка MySQL возвращает

Недопустимый JSON текст в аргументе 1 для функции json_extract: "Недопустимое значение." в позиции 0.

Почему?

1 Ответ

1 голос
/ 12 марта 2020

Значение столбца metdata содержит искаженный JSON как минимум для одной строки в таблице.

Мы ожидаем, что при полном удалении условия a = 'b' мы также увидим то же самое ошибка.

Я подозреваю, что различие в поведении связано с порядком выполняемых операций. Когда условие a = 'b' вычисляется первым, это исключает строки до вычисления выражения JSON_EXTRACT(metadata). Поскольку строка не соответствует условию a = 'b', MySQL использует ярлык, она не оценивает JSON_EXTRACT, она уже знает, что строка будет исключена.

Когда сравнения выполняются в другом порядке, когда сначала выполняется функция JSON_EXTRACT, возникает ошибка, когда выражение вычисляется для строк с недопустимым JSON в metadata.


Сводка:

В таблице есть хотя бы одна строка с неправильным форматом JSON, хранящаяся в столбце metadata.

Разница в наблюдаемом поведении двух запросов обусловлена ​​разным порядком операций .

Предложение:

Рекомендуется использовать функцию JSON_VALID для идентификации строк с недопустимыми значениями.


Выдержка из MySQL Справочное руководство

JSON_EXTRACT

Возвращает данные из документа JSON, выбранного из частей документа, соответствующих аргументам пути. Возвращает NULL, если какой-либо аргумент равен NULL или пути отсутствуют, и в документе содержится значение. Ошибка возникает, если аргумент json_do c не является допустимым JSON документом или любой аргумент пути не является допустимым выражением пути.

https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json -экстракт

JSON_VALID

https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json -действительный

...