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

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

car_mileage表结构

问题核心

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.06 08:31:15