MySQL - extra->>“$.multiple“用法详解

解读 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"
部分 含义
extra 列名,该列的数据类型必须是 JSON
->> JSON 解引用运算符(Unquoting JSON extractor)
$.multiple JSON 路径表达式,表示提取 JSON 文档中 multiple键对应的值

二、等价写法

复制代码
-- 写法1:使用 ->> 运算符(简洁)
extra->>"$.multiple"

-- 写法2:使用 JSON_UNQUOTE + JSON_EXTRACT(功能等价)
JSON_UNQUOTE(JSON_EXTRACT(extra, '$.multiple'))

-- 写法3:使用 -> 运算符(带引号)
extra->'$.multiple'

三、->>->的区别

运算符 返回值 示例结果
-> 带双引号的 JSON 字符串 "100"
->> 纯字符串(去除引号) 100
复制代码
-- 假设 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"→ 返回 2

  • extra->>"$.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 列中提取指定键的值的高效语法,相当于:

  1. 先通过 JSON_EXTRACT()提取 JSON 路径的值

  2. 再用 JSON_UNQUOTE()去掉外层引号

一句话总结:它是 MySQL 为了方便操作 JSON 数据而提供的语法糖,让你可以直接在 SQL 中像访问对象属性一样提取 JSON 字段的值。