MySQL选择具有特定JSON属性值的字段

52

如何编写一个基本的MySQL查询,其中包含在JSON数据类型字段内部的属性的WHERE子句?我在SO上没有看到针对JSON字段的基本where子句。

类似于这样的内容,但是当然这些都不起作用:

SELECT * from my_table where meta_data->name = 'bob';

SELECT * from my_table where meta_data[name] IS NOT NULL;
2个回答

109

如何查询JSON数据类型字段的一些示例:

SELECT * FROM users WHERE JSON_EXTRACT(meta_data, "$.first_name") = 'bob';

SELECT * FROM users WHERE JSON_EXTRACT(meta_data, "$.age") IS NOT NULL;

SELECT * FROM users WHERE JSON_EXTRACT(meta_data, "$.accepted_policy") = true;

使用mysql 5.7.9+版本

你也可以直接这样做(JSON_EXTRACT的简化方式):

SELECT * FROM users WHERE meta_data->"$.first_name" = 'bob'

你可能会注意到你的json数据结果被“引用”了。你可以使用JSON_UNQUOTE,或者你可以使用这个快捷方式--JSON_EXTRACT&JSON_UNQUOTE的组合:

You might notice your json data results are "quoted". You could use JSON_UNQUOTE, or you could use this, which is a shortcut of JSON_EXTRACT & JSON_UNQUOTE:

SELECT meta_data->>"$.first_name" FROM users WHERE meta_data->>"$.first_name" IS NOT NULL

并且可以从子对象中选择数据:

SELECT meta_data->>"$.address.tel" FROM users WHERE meta_data->>"$.address.street" = "123 Main St"

文档: https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html


6
在mysql中使用以下查询来进行带有JSON数据类型字段的WHERE操作。
SELECT meta_data->'$.first_name' meta_data FROM users WHERE INSTR(meta_data->'$.first_name','123') > 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接