求助:MariaDB中BETWEEN操作符处理字符串列的异常问题
问题描述
我有一张名为Fahrer的表,测试数据如下:
+------------+----------+------------+ | PersonalNr | Vorname | Nachname | +------------+----------+------------+ | 1 | Thorsten | Anker | | 2 | Michelle | Craft | | 3 | Sandra | Bäcker | | 4 | Heinz | Tölpel | | 5 | Horst | Brot | | 6 | Merle | Breitbarth | | 7 | Boris | Baum | | 8 | Emerich | Adenauer | | 9 | Wilhelm | Hase | | 10 | Nora | Holzmann | | 11 | Winfried | Hildebrand | | 12 | Jupp | Garb | | 13 | Helene | Braun | | 14 | Herwig | Jaeger | | 15 | Jonathan | Berger | | 16 | Jimmy | Gehrig | | 17 | Odelia | Fischer | +------------+----------+------------+
当对PersonalNr列执行如下查询时:
SELECT * FROM Fahrer WHERE PersonalNr BETWEEN 9 AND 12;
得到了预期的结果:
+------------+----------+------------+ | PersonalNr | Vorname | Nachname | +------------+----------+------------+ | 9 | Wilhelm | Hase | | 10 | Nora | Holzmann | | 11 | Winfried | Hildebrand | | 12 | Jupp | Garb | +------------+----------+------------+
但执行如下查询时:
SELECT * FROM Fahrer WHERE Nachname BETWEEN "C" and "H";
所有包含以H开头的Nachname值的行都被排除在结果之外。请问我的推理存在哪些错误?
问题分析
你混淆了数值类型和字符串类型使用BETWEEN的逻辑:
- 对于数值类型,
BETWEEN a AND b等价于>=a AND <=b,边界值会被包含在内。 - 对于字符串类型,
BETWEEN "C" AND "H"的逻辑是匹配所有字典序大于等于"C"且小于等于"H"的字符串。这里的字符串比较是逐字符进行的:- 单字符的"H"和以"H"开头的多字符姓氏(比如"Hase"、"Holzmann")比较时,第一个字符相同,但"H"没有后续字符,因此字典序上*"H" < "Hase"*,所以这些多字符姓氏不满足
<= "H"的条件,自然不会被包含在结果里。
- 单字符的"H"和以"H"开头的多字符姓氏(比如"Hase"、"Holzmann")比较时,第一个字符相同,但"H"没有后续字符,因此字典序上*"H" < "Hase"*,所以这些多字符姓氏不满足
正确的查询写法
如果要获取所有以C到H开头的Nachname记录,可以采用以下两种方式:
- 方式一:提取姓氏的首字符进行范围比较
SELECT * FROM Fahrer WHERE LEFT(Nachname, 1) BETWEEN "C" AND "H";
- 方式二:使用LIKE匹配(适合不支持LEFT函数的数据库)
SELECT * FROM Fahrer WHERE Nachname LIKE "C%" OR Nachname LIKE "D%" OR Nachname LIKE "E%" OR Nachname LIKE "F%" OR Nachname LIKE "G%" OR Nachname LIKE "H%";
内容的提问来源于stack exchange,提问作者SPOOCQ
相关产品推荐
相关产品推荐

