Слишком долго для комментария ...
Похоже, это связано с оптимизацией, выполняемой MySQL, когда в выражении IN
есть только одно значение (возможно, преобразовывающее его в выражение a = b
), а затем игнорируется кавычки. Строго говоря,
SELECT *
FROM `someTable`
WHERE data->'$.someData' in ('A')
или
SELECT *
FROM `someTable`
WHERE data->'$.someData' = 'A'
не должен возвращать данные, потому что
SELECT data->'$.someData'
FROM someTable;
возвращает
"A"
"B"
, что не совпадает с A
. Вам нужно использовать JSON_UNQUOTE
(или, если у вас MySQL 5.7.13 или более поздняя версия, оператор ->>
), чтобы получить фактическое значение клавиши someData
:
SELECT JSON_UNQUOTE(data->'$.someData') FROm someTable;
SELECT data->>'$.someData' FROm someTable;
что дает
A
B
, который затем отлично работает с выражением IN
:
SELECT *
FROM `someTable`
WHERE JSON_UNQUOTE(data->'$.someData') in ('A','B')
-- or use WHERE data->>'$.someData' in ('A','B')
Выход:
id data
1 {"someData":"A"}
2 {"someData":"B"}
Демонстрация на dbfiddle