如何让MySQL查询返回含无记录用户(score为N/A)的结果?
解决SQL查询包含不存在用户并显示默认值的问题
现有a_team表数据
| name | score |
|---|---|
| tony | 23 |
| john | 32 |
| eddy | 25 |
| mark | 21 |
| nick | 26 |
| alex | 27 |
| nick | 23 |
原查询问题
原使用的查询语句:
SELECT name, name FROM a_team WHERE (name LIKE 'tony%' or name LIKE 'john%' or name LIKE 'eddy%' or name LIKE 'mike%' or name LIKE 'paul%')
仅能返回表中已存在的tony、john、eddy的记录,无法包含不存在的mike和paul。需要修改查询,让结果包含这两个用户,且他们的score字段显示为n/a,预期结果如下:
预期结果
| name | score |
|---|---|
| tony | 23 |
| john | 32 |
| eddy | 25 |
| mike | n/a |
| paul | n/a |
解决方案
可以通过UNION ALL将表中已存在的目标用户记录,与手动构造的不存在用户记录合并,具体SQL语句如下:
精确匹配版本
SELECT name, CAST(score AS CHAR) AS score FROM a_team WHERE name IN ('tony', 'john', 'eddy') UNION ALL SELECT 'mike' AS name, 'n/a' AS score UNION ALL SELECT 'paul' AS name, 'n/a' AS score ORDER BY name;
前缀匹配版本(保留原LIKE逻辑)
SELECT name, CAST(score AS CHAR) AS score FROM a_team WHERE name LIKE 'tony%' OR name LIKE 'john%' OR name LIKE 'eddy%' UNION ALL SELECT 'mike' AS name, 'n/a' AS score UNION ALL SELECT 'paul' AS name, 'n/a' AS score ORDER BY name;
说明
- 第一部分查询表中符合条件的已存在用户,用
CAST(score AS CHAR)将数值型的score转为字符类型,避免和n/a的字符串类型出现兼容问题(如果你的score字段本身就是字符类型,可以省略转换)。 - 后面两个
UNION ALL语句分别构造mike和paul的虚拟记录,直接指定score为n/a。 - 最后用
ORDER BY name可以让结果按名称排序,和预期结果结构一致。
内容的提问来源于stack exchange,提问作者Raihan
相关产品推荐
相关产品推荐

