You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL与PHP中检查JSON对象键值是否非空

MySQL 动态检查JSON对象指定键值是否为空并统计

解决方案思路

要实现动态检查用户指定的JSON键值是否为空,并返回对应的状态和空值数量,需结合MySQL的JSON函数与动态SQL处理:

  1. 提取category节点作为newval字段;
  2. 针对用户输入的每个键,判断其对应的值是否为空字符串;
  3. 统计空值总数量,根据数量设置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;

执行结果

针对示例数据,执行后会得到如下结果:

newvalStatusCount
{"3":"48","9":"14","11":"16","8":"9"}00
{"67":"7","83":"38","84":"23","85":"10"}00
{"8":"","6":"5","9":"","11":""}13

注意事项

  • 若用户输入的键包含特殊字符(如双引号),需通过REPLACE(key_str, '"', '\\"')转义,避免SQL语法错误;
  • nums子查询中的数字数量需覆盖用户可能输入的最大键数量,如需支持更多键,可添加更多UNION ALL SELECT n语句;
  • 使用JSON_UNQUOTE是因为JSON_EXTRACT返回带引号的JSON字符串,需去除引号后才能与空字符串''比较。

内容的提问来源于stack exchange,提问作者user3209031

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:30:41