如何在MySQL与PHP中检查JSON对象键值是否非空
MySQL 动态检查JSON对象指定键值是否为空并统计
解决方案思路
要实现动态检查用户指定的JSON键值是否为空,并返回对应的状态和空值数量,需结合MySQL的JSON函数与动态SQL处理:
- 提取
category节点作为newval字段; - 针对用户输入的每个键,判断其对应的值是否为空字符串;
- 统计空值总数量,根据数量设置
Status(1表示存在空值,0表示无空值)。
具体实现
假设用户输入的键为逗号分隔的字符串(例如'8,6,9,11'),通过以下动态SQL实现需求:
1. 定义用户输入的键列表
SET @keys = '8,6,9,11'; -- 替换为用户实际输入的键列表
2. 动态生成空值统计表达式
SET @count_expr = ( SELECT GROUP_CONCAT( 'IF(JSON_UNQUOTE(JSON_EXTRACT(`catgval`, ''$.category."', REPLACE(key_str, '"', '\\"'), '"'')) = '''', 1, 0)' SEPARATOR ' + ' ) FROM ( SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(@keys, ',', n), ',', -1)) AS key_str FROM (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) nums WHERE n <= LENGTH(@keys) - LENGTH(REPLACE(@keys, ',', '')) + 1 ) keys_list );
这段代码会将用户输入的每个键转换为判断表达式(例如键8对应IF(JSON_UNQUOTE(JSON_EXTRACT(catgval, '$.category."8"')) = '', 1, 0)),最终用+拼接所有表达式,用于统计空值总数。
3. 生成并执行完整查询
SET @sql = CONCAT( 'SELECT JSON_EXTRACT(`catgval`, ''$.category'') AS newval, IF(', @count_expr, ' > 0, 1, 0) AS Status, ', @count_expr, ' AS Count FROM usersys;' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
执行结果
针对示例数据,执行后会得到如下结果:
| newval | Status | Count |
|---|---|---|
| {"3":"48","9":"14","11":"16","8":"9"} | 0 | 0 |
| {"67":"7","83":"38","84":"23","85":"10"} | 0 | 0 |
| {"8":"","6":"5","9":"","11":""} | 1 | 3 |
注意事项
- 若用户输入的键包含特殊字符(如双引号),需通过
REPLACE(key_str, '"', '\\"')转义,避免SQL语法错误; nums子查询中的数字数量需覆盖用户可能输入的最大键数量,如需支持更多键,可添加更多UNION ALL SELECT n语句;- 使用
JSON_UNQUOTE是因为JSON_EXTRACT返回带引号的JSON字符串,需去除引号后才能与空字符串''比较。
内容的提问来源于stack exchange,提问作者user3209031
相关产品推荐
相关产品推荐

