如何编写含JSON类型字段属性WHERE条件的基础MySQL查询?
在MySQL中针对JSON字段属性编写WHERE子句的基础方法
嘿,我来帮你搞定这个MySQL JSON字段筛选的问题!其实MySQL从5.7版本开始就原生支持JSON类型字段的查询了,下面给你几个最常用的基础写法,都是实战里能直接用的:
1. 用->>运算符(最简洁推荐)
这个运算符是JSON_UNQUOTE(JSON_EXTRACT())的简写,能直接提取JSON属性并返回不带引号的字符串/数值,非常适合在WHERE子句里直接做比较。
举个例子:假设你有一张users表,里面有个JSON类型的字段profile,结构大概是这样的:
{ "name": "John", "city": "New York", "age": 35, "address": { "zipcode": "10001" } }
如果你要筛选city等于"New York"的用户,SQL可以这么写:
SELECT * FROM users WHERE profile->>'$.city' = 'New York';
如果是数字类型的属性(比如age大于30),直接用数值比较就行:
SELECT * FROM users WHERE profile->>'$.age' > 30;
嵌套的JSON属性也能直接定位,比如筛选address里的zipcode为"10001"的记录:
SELECT * FROM users WHERE profile->>'$.address.zipcode' = '10001';
2. 用JSON_EXTRACT()函数(更直观的写法)
如果你觉得运算符记不住,用函数写法也可以,效果是一样的。不过要注意:JSON_EXTRACT()返回的是带引号的JSON格式值,所以比较的时候要对应上引号,或者搭配JSON_UNQUOTE()去掉引号。
比如和上面第一个例子等价的写法(带引号比较):
SELECT * FROM users WHERE JSON_EXTRACT(profile, '$.city') = '"New York"';
或者用JSON_UNQUOTE()处理后再比较:
SELECT * FROM users WHERE JSON_UNQUOTE(JSON_EXTRACT(profile, '$.city')) = 'New York';
常见坑点提醒
- 别搞混
->和->>:->只做提取,返回带引号的JSON值;->>会自动去掉引号,返回原生数据类型,所以WHERE子句里用->>更省心。 - 确保JSON路径正确:路径开头的
$代表整个JSON对象,后面用.来访问属性,数组的话用[索引](比如$.hobbies[0]取第一个爱好)。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

