if(STRCMP(oori.account_holder,'[]'),JSON_UNQUOTE(oori.account_holder->'$[]."nickName"'),'无') 挂账人,
时间: 2023-08-25 20:04:35 浏览: 42
根据你提供的信息,这个查询语句是从一个 JSON 字段中提取 "nickName" 值,并在该字段不为空的情况下返回该值,否则返回字符串 "无"。
但是,这个查询语句可能存在一个语法错误。在 MySQL 8.0 中,JSON_EXTRACT 函数用于从 JSON 字段中提取值。如果你正在使用 MySQL 8.0 或更高版本,则应该将 JSON_EXTRACT 函数用于从 JSON 字段中提取 "nickName" 值,而不是使用箭头运算符(->)。
因此,正确的查询语句应该是:
```sql
IF(STRCMP(oori.account_holder, '[]'), JSON_UNQUOTE(JSON_EXTRACT(oori.account_holder, '$[]."nickName"')), '无') AS 挂账人
```
这个查询语句将首先检查 "account_holder" 字段是否为空数组,如果不是,则使用 JSON_EXTRACT 函数从 "account_holder" 字段中提取 "nickName" 值,并使用 JSON_UNQUOTE 函数消除该值周围的双引号。如果 "account_holder" 字段是空数组,则返回字符串 "无"。
相关问题
IF(STRCMP(oori.account_holder, '[]'), JSON_UNQUOTE(JSON_EXTRACT(oori.account_holder, '$[]."nickName"')), '无') AS 挂账人,报错 Invalid JSON path expression. The error is around character position 2.
这个错误可能是由于 JSON 数据中缺少 "nickName" 字段或 "account_holder" 字段为空数组,导致 JSON_EXTRACT 函数无法从中提取值。
你可以尝试使用 JSON_VALID 函数验证 JSON 数据是否格式正确,例如:
```sql
SELECT JSON_VALID(oori.account_holder) FROM your_table;
```
此外,你可以使用 JSON_OBJECT 或 JSON_ARRAY 函数创建一个新的 JSON 对象或数组,这可以避免由于空值或缺少字段而导致的错误。例如:
```sql
IF(STRCMP(oori.account_holder, '[]'), JSON_UNQUOTE(JSON_EXTRACT(oori.account_holder, '$[]."nickName"')), '无') AS 挂账人,
-- 可以改写为 --
JSON_UNQUOTE(IFNULL(JSON_EXTRACT(oori.account_holder, '$[]."nickName"'), JSON_OBJECT())) AS 挂账人,
```
这个查询语句将首先使用 JSON_EXTRACT 函数从 "account_holder" 字段中提取 "nickName" 值。如果该值不存在,则使用 JSON_OBJECT 函数创建一个新的空 JSON 对象,并使用 IFNULL 函数将其作为默认值返回。最后,使用 JSON_UNQUOTE 函数消除该值周围的双引号。
希望这个新的查询语句可以帮助你解决问题。
link_s = list_entry(poss, struct m0_node_list, list); printf("---------------------"); printf("links :%s %d %d\n", link_s->node.name, link_s->node.key, link_s->node.type); printf("---------------------"); printf("---------------------"); if (strcmp(link_s->node.name, "temp") == 0) { stm->key = link_s->node.key; stm->new_val.f_val = cJSON_GetObjectItem(cjson_r, "temp")->valuedouble; //解析对象 stm->type = link_s->node.type; printf("temp %f %d %d\n", stm->new_val.f_val, stm->key, stm->type); } if (strcmp(link_s->node.name, "humi") == 0) { stm->key = link_s->node.key; stm->new_val.i_val = cJSON_GetObjectItem(cjson_r, "humi")->valueint; //解析对象 stm->type = link_s->node.type; printf("humi %d %d %d\n", stm->new_val.i_val, stm->key, stm->type); } if (strcmp(link_s->node.name, "bat") == 0) { stm->key = link_s->node.key; stm->new_val.i_val = cJSON_GetObjectItem(cjson_r, "bat")->valueint; //解析对象 stm->type = link_s->node.type; printf("bat %d %d %d\n", stm->new_val.i_val, stm->key, stm->type); } if (strcmp(link_s->node.name, "led") == 0) { printf("---------------------"); stm->key = link_s->node.key; stm->new_val.b_val = cJSON_GetObjectItem(cjson_r, "led")->valueint; //解析对象 stm->type = link_s->node.type; printf("led %d %d %d\n", stm->new_val.b_val, stm->key, stm->type); }
这段代码看起来像是从一个链表中取出节点,然后根据节点的名称解析 JSON 数据,并将解析结果存储到一个结构体变量 stm 中。具体来说,这段代码的流程可能是这样的:
1. 从 poss 中取出一个节点 link_s。
2. 判断 link_s 的名称,如果是 "temp",则从 cjson_r 中解析出 "temp" 字段的值,赋值给 stm 的 new_val.f_val 字段。
3. 如果是 "humi",则从 cjson_r 中解析出 "humi" 字段的值,赋值给 stm 的 new_val.i_val 字段。
4. 如果是 "bat",则从 cjson_r 中解析出 "bat" 字段的值,赋值给 stm 的 new_val.i_val 字段。
5. 如果是 "led",则从 cjson_r 中解析出 "led" 字段的值,赋值给 stm 的 new_val.b_val 字段。
最后,将 stm 的 key 字段和 type 字段赋值为 link_s 的对应值。
需要注意的是,这段代码无法单独看出来是什么意思,需要结合上下文和相关代码才能理解。