【MySQL】 |
您所在的位置:网站首页 › mysql查询空值返回结果为空 › 【MySQL】 |
目录 背景知识 SQL语句分析 改进后的SQL语句 知识扩展 注意事项 技术是为业务服务的, 先不管什么奇怪的需求, 先技术实现它... 背景知识在数据库中,有时需要生成具有特定格式的唯一ID。例如,这里的ID由当前日期(格式为yyyymmdd)和一个顺序号(四位数)组成。每当需要添加新的记录时,就要生成一个新的ID,该ID比当天已有的最大ID大1。 SQL语句分析原始的SQL语句试图获取当天最大的ID,然后将其加1以生成新的ID。如果当天没有ID,就默认使用'0001'作为顺序号。 公司表获取最大ID且加1: ID示例:yyyymmdd+0001 SELECT IFNULL(RIGHT(ac.id + 1, 4), '0001') numMax FROM app_company ac WHERE LEFT(ac.id, 8) = DATE_FORMAT(now(), '%Y%m%d') ORDER BY RIGHT(ac.id, 4) DESC LIMIT 1这个查询有几个问题: IFNULL函数不会处理非NULL的“无效”值(如'N/A')。在没有任何记录的情况下,RIGHT(ac.id + 1, 4)将不会返回任何结果,因此IFNULL将返回'0001'。使用ORDER BY和LIMIT来获取最大值效率较低。 改进后的SQL语句改进后的SQL语句使用MAX函数来找出当天最大的ID,然后通过IFNULL处理当天没有任何ID的情况。这样就不需要ORDER BY和LIMIT子句,因为MAX函数已经能够找到最大的ID。 SELECT IFNULL(MAX(RIGHT(ac.id, 4)) + 1, '0001') numMax FROM app_company ac WHERE LEFT(ac.id, 8) = DATE_FORMAT(now(), '%Y%m%d')![]() 在实际使用中,直接在数据库层面进行ID的生成可能会有并发问题,特别是在高并发的环境下。为了确保ID的唯一性和顺序,可能需要采用其他机制,比如应用层的锁或者使用数据库的序列(在MySQL 8.0+中为AUTO_INCREMENT属性)。 此外,如果ac.id是字符型字段,直接进行+ 1操作可能会导致错误,因为字符型和数值型的操作不同。在这种情况下,可能需要先将ID的顺序号部分转换为数值型,进行加法操作后再转换回字符型。 有用请点赞,养成良好习惯! 疑问、交流、鼓励请留言! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |