You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:58:55