MySQL自定义函数仅在匹配单行时返回结果的实现方案
高效实现MySQL自定义函数FindUser:唯一模糊匹配时返回用户ID
可以用单次聚合查询搞定这个需求,不用两次查库或者折腾变量。核心就是在同一条查询里,既统计模糊匹配到的总条数,又拿到唯一匹配时的用户ID,最后通过判断条数是否为1来返回结果。
实现代码
DELIMITER // CREATE FUNCTION FindUser(p_FirstName NVARCHAR(100), p_LastName NVARCHAR(100)) RETURNS INT DETERMINISTIC BEGIN DECLARE result_id INT; SELECT CASE WHEN COUNT(*) = 1 THEN MAX(ID) ELSE NULL END INTO result_id FROM users WHERE FirstName LIKE p_FirstName AND LastName LIKE p_LastName; RETURN result_id; END // DELIMITER ;
关键说明
- 用
COUNT(*)统计模糊匹配的总记录数,MAX(ID)在仅一条匹配时,自然就是该记录的ID(反正只有一个,用MIN或者直接取值效果一致)。 - 通过
CASE语句判断:当匹配行数恰好为1时返回对应ID,否则返回NULL,完全贴合需求。 - 标记
DETERMINISTIC(确定性函数)有助于MySQL优化执行计划,提升查询效率。 - 函数的两个参数支持标准LIKE模糊匹配语法,比如传入
'%Har%'就能匹配名字包含Har的用户。
测试示例
-- 唯一匹配,返回2 SELECT FindUser('Harry', 'Potter'); -- 无匹配结果,返回NULL SELECT FindUser('Ron', 'Weasley'); -- 新增一条同名前缀记录后,匹配多行,返回NULL INSERT INTO users (ID, FirstName, LastName) VALUES (4, 'Harry', 'Potter Jr.'); SELECT FindUser('Harry', '%Potter%');
内容的提问来源于stack exchange,提问作者unknown6656
相关产品推荐
相关产品推荐

