解读extra->>"$.multiple 用法
SELECT
id, user_id, app_order_id, order_no, amount, extra->>"$.multiple", extra->>"$.bonus"
FROM
`slots-lavish-luck`.`charge_records`
WHERE
`id` >= '78785070'
AND `id` <= '80068528'
AND `charge_id` IN ( '443', '444', '445', '446', '447', '448' )
AND `status` = '3'
AND `extra` LIKE '%multiple%'
and extra->>"$.bonus" < amount
ORDER BY
`id` DESC
LIMIT 0,
100;
extra->>"$.multiple"用法详解
这是 MySQL 5.7.13+ 引入的JSON 字段的内联路径提取运算符,专门用于操作 JSON 类型的数据列。
一、语法拆解
extra->>"$.multiple"部分 | 含义 |
|---|---|
| 列名,该列的数据类型必须是 |
| JSON 解引用运算符(Unquoting JSON extractor) |
| JSON 路径表达式,表示提取 JSON 文档中 |
二、等价写法
-- 写法1:使用 ->> 运算符(简洁) extra->>"$.multiple" -- 写法2:使用 JSON_UNQUOTE + JSON_EXTRACT(功能等价) JSON_UNQUOTE(JSON_EXTRACT(extra, '$.multiple')) -- 写法3:使用 -> 运算符(带引号) extra->'$.multiple'三、->>和->的区别
运算符 | 返回值 | 示例结果 |
|---|---|---|
| 带双引号的 JSON 字符串 |
|
| 纯字符串(去除引号) |
|
-- 假设 extra = '{"multiple": 100, "bonus": 50}' -- 使用 -> SELECT extra->'$.multiple'; -- 返回 "100"(带引号) -- 使用 ->> SELECT extra->>'$.multiple'; -- 返回 100(纯数字字符串)四、在你的 SQL 中的作用
extra->>"$.multiple" -- 提取 JSON 字段中 multiple 键的值 extra->>"$.bonus" -- 提取 JSON 字段中 bonus 键的值假设extra列中存储的数据格式如下:
{ "multiple": 2, "bonus": 88, "source": "double_reward", "event_id": "EVT123456" }则:
extra->>"$.multiple"→ 返回2extra->>"$.bonus"→ 返回88
五、在 WHERE 条件中的应用
你的查询中还用到了 JSON 字段的比较:
AND extra->>"$.bonus" < amount这条条件的意思是:从 JSON 字段中提取bonus的值,并与amount字段进行比较,筛选出 bonus 小于 amount 的记录。
六、性能注意事项
-- 这种方式无法使用索引,会触发全表扫描 WHERE extra->>"$.bonus" < amount -- 如果要优化,可以考虑: -- 1. 创建虚拟列 + 索引(MySQL 5.7+) ALTER TABLE charge_records ADD COLUMN bonus_value DECIMAL(10,2) GENERATED ALWAYS AS (extra->>"$.bonus") STORED, ADD INDEX idx_bonus (bonus_value); -- 2. 然后查询就可以走索引了 WHERE bonus_value < amount七、其他常用 JSON 路径操作
-- 提取嵌套字段 extra->>"$.user.info.name" -- 提取数组元素 extra->>"$.items[0]" -- 第一个元素 extra->>"$.items[-1]" -- 最后一个元素 -- 提取所有值 extra->>"$[*]" -- 条件判断(JSON_CONTAINS) JSON_CONTAINS(extra, '"multiple"', '$') -- 检查是否存在 multiple 键八、总结
extra->>"$.multiple"是一种从 JSON 列中提取指定键的值的高效语法,相当于:
先通过
JSON_EXTRACT()提取 JSON 路径的值再用
JSON_UNQUOTE()去掉外层引号
一句话总结:它是 MySQL 为了方便操作 JSON 数据而提供的语法糖,让你可以直接在 SQL 中像访问对象属性一样提取 JSON 字段的值。