Mysql - 如何比较两个Json对象?

ada*_*m78 11 mysql json

将整个MySql json列与json对象进行比较的语法是什么?

以下不起作用:

select count(criteria) from my_alerts where criteria = '{"industries": ["1"], "locations": ["1", "2"]}'
Run Code Online (Sandbox Code Playgroud)

即使条件列有值,我也会得到0 {"industries": ["1"], "locations": ["1", "2"]}

如果我错了,请纠正我,但如果两个JSON对象具有相同的密钥集,则每个密钥在两个对象中具有相同的值.键和值的顺序将被忽略.那以下应该是一样的?

 {"industries": ["1"], "locations": ["1", "2"]} = {"locations": ["2", "1"], "industries": ["1"]}
Run Code Online (Sandbox Code Playgroud)

*更新*

我已经设法通过转换为json来实现它,如下所示:

select count(criteria) from my_alerts where criteria = CAST('{"industries": ["1"], "locations": ["1", "2"]}' AS JSON)
Run Code Online (Sandbox Code Playgroud)

然而,虽然在比较期间忽略了键的顺序,但仍然比较值的顺序.所以以下是假的:

{"locations": ["1", "2"]} = {"locations": ["2", "1"]}
Run Code Online (Sandbox Code Playgroud)

有没有办法强制比较忽略值的顺序呢?

mix*_*xel 6

您可以使用CAST()函数:

SELECT count(criteria)
FROM my_alerts 
WHERE criteria = CAST('{"industries": ["1"], "locations": ["1", "2"]}' AS JSON)
Run Code Online (Sandbox Code Playgroud)


Kev*_*ary 5

您可以使用JSON_CONTAINS以下方法执行此操作:

SELECT COUNT(criteria) 
FROM my_alerts 
WHERE JSON_CONTAINS(criteria,'{"industries": ["1"], "locations": ["1", "2"]}')
Run Code Online (Sandbox Code Playgroud)

这将执行忽略值顺序的比较,这很关键,因为 MySQL 将重新排序 JSON 属性以提高 INSERT 的效率。

  • 可以在旁边使用 JSON_LENGTH 以确保 json 完全相等 (2认同)