MySQL查询需求:无匹配结果返回0,有匹配则返回对应字段值
MySQL查询:无匹配时返回0,有匹配时返回字段值
问题分析
你之前尝试的语句存在这些问题:
- 第一个语句用
EXISTS判断数据是否存在,但只能返回固定的1或0,拿不到RepairingId的实际值。 - 第二、三个语句在WHERE条件没匹配到数据时,整个查询直接返回空结果,
IFNULL和CASE的逻辑根本没机会执行,所以看不到任何输出。
解决方案
方案1:聚合函数 + IFNULL(推荐,适合多数场景)
用MAX()或MIN()这类聚合函数,即使没有匹配行也会返回NULL,再用IFNULL把NULL转成0,有匹配时返回对应字段值:
SELECT IFNULL(MAX(RepairingId), 0) AS RepairId FROM expenses WHERE WorkDate = '2023-07-24 00:00:00' AND VehRegNo = 'PB-56B-8508';
如果你的查询条件保证只会返回一行数据,MAX()和MIN()效果一样;如果可能返回多行,MAX()会取最大的RepairingId,根据你的需求调整就行。
方案2:子查询 + IFNULL
把查询结果作为子查询,外层判断是否为NULL,是就返回0:
SELECT IFNULL( (SELECT RepairingId FROM expenses WHERE WorkDate = '2023-07-24 00:00:00' AND VehRegNo = 'PB-56B-8508'), 0 ) AS RepairId;
注意:如果子查询会返回多行数据,这个语句会报错,适合查询条件唯一的场景。
方案3:UNION ALL构造默认行
先查匹配的数据,要是没查到就返回默认的0:
SELECT RepairingId AS RepairId FROM expenses WHERE WorkDate = '2023-07-24 00:00:00' AND VehRegNo = 'PB-56B-8508' UNION ALL SELECT 0 AS RepairId FROM dual WHERE NOT EXISTS ( SELECT 1 FROM expenses WHERE WorkDate = '2023-07-24 00:00:00' AND VehRegNo = 'PB-56B-8508' ) LIMIT 1;
dual是MySQL自带的虚拟表,用来生成单行数据。LIMIT 1是为了避免匹配到数据时,同时返回默认的0行。
内容的提问来源于stack exchange,提问作者Sudhir Solka
相关产品推荐
相关产品推荐

