SQL如何查询给定姓名列表中存在及不存在于用户表的用户
最优实现方案
核心思路是把需要查询的姓名列表构建成临时行集,再和用户表做左连接,这样左表的所有姓名都会完整保留,匹配到的用户信息会正常返回,未匹配到的姓名对应的用户字段会显示为NULL,可直接区分匹配状态。
主流数据库通用写法(兼容SQL Server、MySQL 8.0+、PostgreSQL等)
-- 先构造待查询的姓名集合 WITH target_names (fullName) AS ( VALUES ('John smith'), ('Bob dylan'), ('Jack smith'), ('Ashley cooper'), ('test12'), ('jane112') ) -- 左连接用户视图,保留所有目标姓名 SELECT DISTINCT t.fullName AS 待查询姓名, u.username, u.fullName AS 库内匹配姓名, u.EmailAddress, u.address, u.number, -- 可选:加标识字段更直观区分匹配结果 CASE WHEN u.fullName IS NOT NULL THEN '匹配成功' ELSE '无匹配记录' END AS 匹配状态 FROM target_names t LEFT JOIN [v_Users] u ON t.fullName = u.fullName
低版本数据库兼容写法(不支持CTE/VALUES行构造的场景)
如果数据库版本较旧不支持上述语法,可以用UNION ALL构造姓名列表:
SELECT DISTINCT t.fullName AS 待查询姓名, u.username, u.fullName AS 库内匹配姓名, u.EmailAddress, u.address, u.number, CASE WHEN u.fullName IS NOT NULL THEN '匹配成功' ELSE '无匹配记录' END AS 匹配状态 FROM ( SELECT 'John smith' AS fullName UNION ALL SELECT 'Bob dylan' AS fullName UNION ALL SELECT 'Jack smith' AS fullName UNION ALL SELECT 'Ashley cooper' AS fullName UNION ALL SELECT 'test12' AS fullName UNION ALL SELECT 'jane112' AS fullName ) t LEFT JOIN [v_Users] u ON t.fullName = u.fullName
方案优势
- 你的表只有数千条记录,两种写法性能都完全满足需求,
fullName字段加索引后查询速度会更快 - 无需查询后手动比对缺失姓名,结果中
匹配状态为无匹配记录的行就是列表中不存在的姓名,对应其他用户字段均为NULL
内容的提问来源于stack exchange,提问作者minhas bassan
相关产品推荐
相关产品推荐

