使用UNION查询首字母A到K的果蔬名称的SQL语法问题
错误原因梳理
- 第一次提交的代码语法问题:
LIKE和BETWEEN是两类独立的运算符,不能搭配使用,BETWEEN可直接对字段值做区间判断,不需要加LIKE - 第二次提交的代码语法&逻辑问题:
- 每个
LIKE判断前都漏写了目标字段Name,导致语法解析失败 - 逻辑运算符使用错误:一个名称不可能同时以A、B等多个不同字母开头,应该用
OR而非AND,但这种逐个枚举匹配规则的写法冗余度过高,不推荐使用
- 每个
推荐实现方案
方案1:LEFT函数+区间判断(全主流数据库兼容,可读性最高)
MySQL、PostgreSQL、SQL Server等所有主流数据库都支持该写法:
SELECT Name FROM Fruit WHERE LEFT(Name, 1) BETWEEN 'A' AND 'K' UNION SELECT Name FROM Vegetables WHERE LEFT(Name, 1) BETWEEN 'A' AND 'K';
说明:UNION会自动对合并后的结果去重,如果你需要保留两个表中重复的名称,可替换为UNION ALL
方案2:通配符匹配写法
如果你不想使用函数,可以用范围通配符实现,SQL Server、Access原生支持以下写法:
SELECT Name FROM Fruit WHERE Name LIKE '[A-K]%' UNION SELECT Name FROM Vegetables WHERE Name LIKE '[A-K]%';
MySQL环境下可以用正则实现同等逻辑:
SELECT Name FROM Fruit WHERE Name REGEXP '^[A-K]' UNION SELECT Name FROM Vegetables WHERE Name REGEXP '^[A-K]';
小提示:如果你的数据库配置为大小写敏感,可将判断字段包裹在UPPER()函数中统一转换为大写后再判断,避免小写首字母的条目匹配失败,示例:WHERE UPPER(LEFT(Name,1)) BETWEEN 'A' AND 'K'
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

