SELECT * from dmp_data_verification_rule where json_extract(extra_note,'$.classCodesB') = '["ACCCCP", "ACCCAC"]' 这段sql,通过json_extract 提取数据,用= 匹配,查询不出数据,是为什么,数据库有这条记录
时间: 2024-02-28 17:54:53 浏览: 17
你的SQL语句使用的是`=`来匹配提取出来的json数组,但是json数组是一个无序的集合,所以如果要精确匹配,你需要使用`JSON_CONTAINS`函数。
以下是一个可以查询出数据的SQL语句示例,可以尝试一下:
```
SELECT * FROM dmp_data_verification_rule
WHERE JSON_CONTAINS(extra_note->'$.classCodesB', '["ACCCCP", "ACCCAC"]', '$');
```
其中,`JSON_CONTAINS`函数用来判断`classCodesB`数组中是否包含完全匹配的数组`["ACCCCP", "ACCCAC"]`,第三个参数`'$'`表示从JSON字符串的顶层开始查找。
另外,如果你要使用`=`符号来匹配json数组,可以使用`JSON_EXTRACT`函数提取数组后再进行匹配。例如,以下SQL语句可以查询出匹配的数据:
```
SELECT * FROM dmp_data_verification_rule
WHERE JSON_EXTRACT(extra_note, '$.classCodesB') = '["ACCCCP", "ACCCAC"]';
```
但是需要注意的是,这种匹配方式只能匹配数组的值完全相等,不能匹配数组的顺序不同的情况。
相关问题
已知表结构为:CREATE TABLE `dmp_data_verification_rule` ( `id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', `rule_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '规则编码', `rule_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '规则说明', `reconfirm_flag` tinyint NOT NULL COMMENT '是否需要人为二次判断', `rule_type_id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则分类id', `rule_set_ids` json DEFAULT NULL COMMENT '规则集ids,数组形式:["1"]', `rule_order` int DEFAULT NULL COMMENT '规则排序', `extra_note` json DEFAULT NULL COMMENT '备注', `creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', `creation_time` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建时间', `modifier` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改人', `modified_time` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改时间', `valid` tinyint NOT NULL COMMENT '合法标识', `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁', PRIMARY KEY (`id`) USING BTREE, KEY `idx_type_id` (`rule_type_id`) USING BTREE COMMENT '规则类型索引', KEY `idx_rule_code` (`rule_code`) USING BTREE COMMENT '规则编码', KEY `idx_rule_order` (`rule_order`) USING BTREE COMMENT '规则排序' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据校验规则表';,extra_note 存储的数据有{"scopeCode": "project", "classCodesA": ["ACCCAC"], "classCodesB": ["ACCCCP","ACCCAC"]},怎么根据ruleTypeId,及classCodesB(数组)进行数据查询,classCodesB传的是个数组,需要判断数组中的元素是否完全相同相等,通过mysql及mapper.xml实现
可以使用MySQL的JSON_CONTAINS函数和JSON_EXTRACT函数来实现。具体的SQL语句如下:
```
SELECT * FROM dmp_data_verification_rule
WHERE rule_type_id = 'your_rule_type_id'
AND JSON_CONTAINS(extra_note->'$.classCodesB', '["ACCCCP", "ACCCAC"]') = 1;
```
这条SQL语句中,我们查询了dmp_data_verification_rule表中rule_type_id为'your_rule_type_id',且extra_note字段中的classCodesB数组完全等于["ACCCCP", "ACCCAC"]的数据。其中,JSON_CONTAINS函数用于判断extra_note中的classCodesB数组是否包含指定的数组,如果包含则返回1,否则返回0。而JSON_EXTRACT函数用于提取extra_note中的classCodesB数组。
在mapper.xml中使用该SQL语句的话,可以把SQL语句写在select元素的text属性中。例如:
```
<select id="selectByRuleTypeAndClassCodesB" resultType="YourResultType">
SELECT * FROM dmp_data_verification_rule
WHERE rule_type_id = #{ruleTypeId}
AND JSON_CONTAINS(extra_note->'$.classCodesB', #{classCodesB}) = 1;
</select>
```
其中,#{ruleTypeId}和#{classCodesB}是使用MyBatis的参数占位符。这样,在调用该方法时,只需要传入ruleTypeId和classCodesB两个参数即可。
res=dmp_load_motion_driver_firmware();卡住了
你好!对于你提出的问题,我可以理解你的代码片段。`dmp_load_motion_driver_firmware()`是一个函数调用,它可能会加载运动驱动器固件。如果你的代码在这一行卡住了,可能有几个原因导致这种情况发生:
1. 编译错误:请确保你的代码编译通过,并且所有的依赖项都已正确安装和配置。
2. 死循环:在函数内部可能存在一个死循环,导致代码无法继续执行。你可以检查函数内部的逻辑,确保没有出现无限循环的情况。
3. 超时:`dmp_load_motion_driver_firmware()`函数可能会执行一个耗时较长的操作,导致代码看起来像是卡住了。你可以尝试等待一段时间,看看是否会有进一步的输出或结果。
为了更好地帮助你,我建议你检查一下代码中的其他部分,以及相关的错误信息或输出。这将有助于更准确地确定问题所在。