Freedo Asked: 2021-02-02 16:22:36 +0800 CST2021-02-02 16:22:36 +0800 CST 2021-02-02 16:22:36 +0800 CST SELECT with where between 未按预期工作 772 我正在尝试使用此查询在名称 C89 到 C110 之间进行过滤。 SELECT id FROM servers WHERE server_name BETWEEN 'C89' AND 'C110' 但这不起作用。如果我将 c89 更改为 c90,它至少会选择两台服务器。就像它只使用计算中的前 2 个数字一样。 谁能帮我 ?我正在使用 mariadb 10.5 我正在寻找一种不需要在查询中添加大量单词的解决方案。为了可读性尽可能精简 select mariadb 2 个回答 Voted Best Answer Rick James 2021-02-02T21:05:53+08:002021-02-02T21:05:53+08:00 一个简短的答案: ... WHERE MID(server, 2) BETWEEN 89 AND 110 或者,如果您需要限制为“C”组服务器: ... WHERE MID(server, 2) BETWEEN 89 AND 110 AND server LIKE "C%" 或者(为了避免“24H1”的麻烦), ... WHERE IF(server LIKE "C%", MID(server, 2) BETWEEN 89 AND 110, FALSE) 哦,现在我看到另一个“坏”的服务器名称(INT1)。面对现实,您需要将一些负担放在 DBA 身上。他必须意识到,实际的方法是说 ... WHERE server BETWEEN 'C89' AND 'C99' OR server BETWEEN 'C100' AND 'C110' 也就是说,根据需要将过滤分解为尽可能多的范围,以便字符串比较可以工作,而不是认为是数字的。 J.D. 2021-02-02T17:32:23+08:002021-02-02T17:32:23+08:00 正如评论中提到的,在比较字符串时,它们是按字典顺序而不是按数字进行比较的(即使它们包含数值)。这意味着每个字符都与相同索引的比较字符串的字符进行比较。例如,比较字符串“10”和“3”将导致“10”在“3”之前,因为“1”在“3”之前。我不确定这是否适用于 MariaDB,但在其他 RDBMS 中,当不确定一个字符与另一个字符的顺序时,您通常可以引用ASCII 表(注意大写字母在小写字母之前)。 如果所有服务器都server_name以字母“C”开头,那么您可以使用REPLACE()MariaDB 中的函数去掉“C”,然后将字符串转换为 INT,如下所示: SELECT id FROM servers WHERE REPLACE(server_name, 'C', '') BETWEEN 89 AND 110
一个简短的答案:
或者,如果您需要限制为“C”组服务器:
或者(为了避免“24H1”的麻烦),
哦,现在我看到另一个“坏”的服务器名称(
INT1
)。面对现实,您需要将一些负担放在 DBA 身上。他必须意识到,实际的方法是说也就是说,根据需要将过滤分解为尽可能多的范围,以便字符串比较可以工作,而不是认为是数字的。
正如评论中提到的,在比较字符串时,它们是按字典顺序而不是按数字进行比较的(即使它们包含数值)。这意味着每个字符都与相同索引的比较字符串的字符进行比较。例如,比较字符串“10”和“3”将导致“10”在“3”之前,因为“1”在“3”之前。我不确定这是否适用于 MariaDB,但在其他 RDBMS 中,当不确定一个字符与另一个字符的顺序时,您通常可以引用ASCII 表(注意大写字母在小写字母之前)。
如果所有服务器都
server_name
以字母“C”开头,那么您可以使用REPLACE()
MariaDB 中的函数去掉“C”,然后将字符串转换为 INT,如下所示: