我在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%'