如果存储的数据是ext_info:{"98%":25,"80%":128,"90%":86}怎么查询90%的值,sql--mysql语句
时间: 2025-08-05 08:43:39 浏览: 4
要查询 `ext_info` 字段中 `90%` 对应的值(即 `86`),你可以使用 MySQL 提供的 **JSON 函数**,特别是 `JSON_EXTRACT()` 和 `JSON_UNQUOTE()` 来提取 JSON 字段中的具体值。
---
## ✅ 示例 SQL 查询语句
### 查询 `ext_info` 中 `"90%"` 的值大于 80 的记录:
```sql
SELECT id, ext_info,
JSON_UNQUOTE(JSON_EXTRACT(ext_info, '$.\"90%\"')) AS value_90
FROM vector
WHERE JSON_UNQUOTE(JSON_EXTRACT(ext_info, '$.\"90%\"')) > 80;
```
---
### 查询 `ext_info` 中 `"90%"` 存在的记录:
```sql
SELECT id, ext_info
FROM vector
WHERE JSON_CONTAINS_PATH(ext_info, 'one', '$.\"90%\"');
```
---
### 查询 `ext_info` 中 `"90%"` 等于 86 的记录:
```sql
SELECT id, ext_info
FROM vector
WHERE JSON_UNQUOTE(JSON_EXTRACT(ext_info, '$.\"90%\"')) = '86';
```
> 注意:`JSON_EXTRACT` 返回的是 JSON 类型值(带引号),所以需要用 `JSON_UNQUOTE()` 去掉引号后再比较。
---
## ✅ 如果字段是 JSON 类型(推荐)
如果你的 `ext_info` 字段是 `JSON` 类型(而不是 `TEXT`),MySQL 会自动验证 JSON 格式,并支持更高效的 JSON 查询。
你可以使用更简洁的写法:
```sql
SELECT id, ext_info->'$.90%' AS value_90
FROM vector
WHERE ext_info->'$.90%' > 80;
```
> `->` 是 `JSON_EXTRACT()` 的快捷写法,返回带引号的 JSON 值。
> `->>` 是 `JSON_UNQUOTE(JSON_EXTRACT())` 的快捷写法。
### 使用 `->>` 查询:
```sql
SELECT id, ext_info->>'$.90%' AS value_90
FROM vector
WHERE ext_info->>'$.90%' > 80;
```
---
## ✅ Java 中如何使用(MyBatis 示例)
如果你在 Java 中使用 MyBatis 或 MyBatis Plus,可以这样写:
### Mapper 接口:
```java
@Mapper
public interface VectorMapper {
@Select("SELECT * FROM vector WHERE JSON_UNQUOTE(JSON_EXTRACT(ext_info, '$.\"90%\"')) > #{threshold}")
List<Vector> findVectorsBy90Percent(int threshold);
}
```
### 实体类:
```java
public class Vector {
private Long id;
private Map<String, Integer> extInfo; // MyBatis 可自动映射 JSON 到 Map
// Getter and Setter
}
```
---
## ✅ 总结
| 查询目标 | SQL 写法 |
|----------|----------|
| 提取 `90%` 的值 | `JSON_UNQUOTE(JSON_EXTRACT(ext_info, '$.\"90%\"'))` |
| 判断 `90%` 是否存在 | `JSON_CONTAINS_PATH(ext_info, 'one', '$.\"90%\"')` |
| 查询 `90%` 大于某个值 | `WHERE ext_info->>'$.90%' > '80'` |
| 查询 `90%` 等于某个值 | `WHERE ext_info->>'$.90%' = '86'` |
---
阅读全文
相关推荐



















