SQL查询统计指定姓名下值大于0的car_Number列数量

问题核心
car_mileage表中car_Number前缀的车辆数量列为动态生成,列数不固定,需要针对指定姓名,统计所有该类列中值大于0的数值总和,预期Joseph统计结果为10,Jose统计结果为8。
实现方案
因为列数不固定,写死列名的静态SQL适配性差,优先用动态SQL自动识别所有符合规则的列完成计算,无需随表结构变动修改代码。
MySQL 通用动态SQL实现
直接从系统表读取当前表所有car_Number开头的列,自动拼接求和逻辑:
-- 传入要统计的目标姓名 SET @query_name = 'Joseph'; SET @sum_clause = NULL; -- 自动拼接所有car_Number列的求和逻辑:值大于0就累加,否则算0 SELECT GROUP_CONCAT( 'IF(`', COLUMN_NAME, '`>0, `', COLUMN_NAME, '`, 0)' SEPARATOR '+' ) INTO @sum_clause FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'car_mileage' AND COLUMN_NAME LIKE 'car_Number%'; -- 组装最终查询语句 SET @final_sql = CONCAT('SELECT ', @sum_clause, ' AS total FROM car_mileage WHERE name = ?'); -- 执行查询 PREPARE stmt FROM @final_sql; EXECUTE stmt USING @query_name; DEALLOCATE PREPARE stmt;
把@query_name变量改成要查询的人名,就能直接得到对应统计值,后续表新增/删除car_Number列不需要改这段代码。
列固定时的简易写法
如果确认后续不会调整car_Number相关列,也可以手动枚举列写死查询逻辑:
SELECT IF(car_Number1>0, car_Number1, 0) + IF(car_Number2>0, car_Number2, 0) + IF(car_Number3>0, car_Number3, 0) -- 按照实际表中的car_Number列依次补全即可 AS total_car FROM car_mileage WHERE name = 'Jose';
提醒:静态写法维护成本高,只要表结构变动就需要同步修改SQL,生产环境不推荐使用。
内容的提问来源于stack exchange,提问作者Joe1988
相关产品推荐
相关产品推荐

