各位 MySQL 大手子快来,请教一个问题

2023-02-10 15:10:21 +08:00
 yukunZhan9

MySQL5.7 如何查询某个值是否在 JSON 类型的字段中呢。

表结构类似这样:

create table xxxtable
(
    id               bigint(22) auto_increment comment '主键 id'
        primary key,
    waring_value_msg json                                not null comment '',
    names_virtual    varchar(20) as (json_unquote(json_extract(`waring_value_msg`, '$.warnMonth')))
)
    comment '' charset = utf8;

create index device_waring_config_names_virtual_index
    on tnor.device_waring_config (names_virtual);

表中 json 格式的数据大致如下:

{
	"warnMonth": [1,2],
	"rouleItem": [{
		"maxValue": 10,
		"minValue": 0,
		"waringMsg": "这是提示信息",
		"warnMonth": "1"
	}, {
		"maxValue": 20,
		"minValue": 10,
		"waringMsg": "这是提示信息",
		"warnMonth": "2"
	}]
}

有什么办法可以通过 SQL 来查询 我给出的 warnMonth 是不是在 JSON 里面呢,类似于这种:

select * from xxxtable where #{warnMonth} in JOSN 中的 warnMonth ;
2131 次点击
所在节点    MySQL
7 条回复
gkair
2023-02-10 15:15:57 +08:00
虚拟列?
nitmali
2023-02-10 15:17:58 +08:00
JSON_CONTAINS_PATH(json, one_or_all, path[, path])
yukunZhan9
2023-02-10 15:18:21 +08:00
@gkair 虚拟列的数据是 [1,2],不能走索引,
比如
```MySQL
select * from xxxtable where 虚拟列 like '%1%';
```
才能查出来
MadbookPro
2023-02-10 15:32:18 +08:00
不懂 SQL, 帮你问了一下 ChatGPT 。
------------------------------------------
您可以使用 MySQL 中的 JSON 函数来查询您给定的 "warnMonth" 是否存在于 JSON 数据中。您可以使用 "json_contains" 函数来实现此功能:

SELECT *
FROM xxxtable
WHERE json_contains(waring_value_msg, json_quote(#{warnMonth}), '$.warnMonth');

请注意,在上面的代码中,我们首先使用 "json_quote" 函数将 "warnMonth" 转换为字符串,然后再使用 "json_contains" 函数检查该字符串是否存在于 "waring_value_msg" 中的 "warnMonth" 键中。

如果要在 "rouleItem" 中搜索,您可以这样写:

SELECT *
FROM xxxtable
WHERE json_contains(waring_value_msg, json_quote(json_object('warnMonth', #{warnMonth})), '$.rouleItem');
xiaoliu926
2023-02-10 16:05:39 +08:00
ChatGPT 的回答:
MySQL 5.7 中可以使用 JSON 函数进行查询,例如 JSON_SEARCH() 函数。你可以使用如下语句来查询 warnMonth 是否在 JSON 中:

sql
Copy code
SELECT *
FROM xxxtable
WHERE JSON_SEARCH(waring_value_msg, 'one', CAST(#{warnMonth} AS JSON)) IS NOT NULL;
其中,#{warnMonth} 表示传入的查询参数,而 JSON_SEARCH 函数则用来搜索 JSON 数据中是否有给定的值。如果搜索结果不为空,说明该值在 JSON 中存在。

请注意,在 MySQL 5.7 中,JSON_SEARCH() 函数的返回值是一个 JSON 字符串,因此需要使用 IS NOT NULL 进行判断。
realpg
2023-02-10 18:08:17 +08:00
还想走索引,想要性能就不要瞎鸡儿搞

就 MYSQL 弱鸡的索引,你这么查都能有效利用的话那索引体积不得几倍表大

真研究性能了,就不要搞啥花活,甚至万事先问问能不能存 int
netnr
2023-02-10 18:40:02 +08:00
存储的 JSON 是格式化的,就用 like '%"warnMonth": "2"%'
理论上只会多不会少,要确保准确性,用数据时解析后再验证过滤一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/914927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX