当 json 列包含 MySQL 8.0 中的键值对象时,无法搜索该列中的值



我在MYSQL 8中搜索JSON列中的值时遇到问题。

目标是选择至少有一个市场值为true的所有记录,参见下面的列值示例。

{"at": false, "au": false, "be": false, "ch": false, "cz": false, "de": false, "dk": false, "es": false, "eu": false, "fi": false, "fr": false, "gl": false, "hk": false, "it": false, "jp": false, "kr": false, "nl": false, "no": false, "se": false, "uk": true, "us": false}

我们已经尝试使用JSON_CONTAINS以及JSON_SEARCH,但最终以0结果结束(不能包括我们尝试过的所有查询,因为我们没有保存它们)。似乎也找不到任何人尝试过这样做一个类似的结构化对象/查询。这个查询可能在MySQL吗?

我们希望能正常工作的原始查询:

SELECT *
FROM
`redirects`
WHERE
JSON_CONTAINS(`synced_markets`, 'true')

我们设法破解了它,因为我们只关心是否至少有一个是真的,通过将其转换为char,但感觉这不是一个合适的解决方案。

WHERE CAST(`synced_markets` AS CHAR) LIKE '%true%'

我想你误解了JSON_CONTAINS的功能。它检查json字符串作为第一个参数是否包含key-value作为第二个参数。不仅仅是价值。正确的用法如下:

SELECT JSON_CONTAINS('{"a": true, "b": false}', '{"a":true}');

命令返回1

阅读手册获取更多信息:https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

也许您可以将列值视为字符串。

SELECT *
FROM
`redirects`
WHERE
`synced_markets` like '%true%'

最新更新