文本和数字值的SQL BETWEEN用法

16

BETWEEN 用于在 WHERE 子句中选择两个值之间的数据范围。
如果我正确,范围的端点是被排除还是包含取决于数据库管理系统。
以下内容让我无法理解:
如果我有一个值表格并执行以下查询:

SELECT food_name 
    FROM health_foods 
    WHERE calories BETWEEN 33 AND 135;`  

查询返回的结果行包括卡路里=33和卡路里=135(即范围端点包括在内)。

但是如果我执行:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'O';

我没有获取以字母 O 开头的 food_name 行。即,这个范围的末尾是不包括在内的。
为了使查询按预期工作,我输入:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'P';`   

我的问题是为什么在数字和文本数据中使用 BETWEEN 有如此大的区别?


可能是SQL Between clause with strings columns的重复问题。 - Kermit
3个回答

23

Between 在处理数字和字符类型的字符串时是完全相同的。两个端点会被包括在内。这是 ANSI 标准的一部分,所以所有 SQL 方言都是这样工作的。

表达式:

where num between 33 and 135

当num为135时匹配,当number为135.00001时不匹配。

同样地,表达式:

where food_name BETWEEN 'G' AND 'O'

将与“O”匹配,但不匹配以“O”开头的任何其他字符串。

一种简单的替代方法是使用“〜”。它具有最大的7位ASCII值,因此对于英语应用程序,通常效果很好:

where food_name between 'G' and 'O~'

您还可以做很多其他的事情。以下是两个建议:

where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'

然而,重要的一点是,between 的使用方式不受数据类型的影响。


5

以“Orange”与“O”的比较为例。“Orange”字符串显然不等于“O”字符串,由于长度更长,它必须大于而不是小于。“但您可以使用“Orange” < "OZZZZZZZZZZZZZZ"。


我不明白你的回答。你的意思是说Orange不等于O吗?Orange的开头字母是O - Cratylus
字符串“Orange”与字符串“O”不同,因为它有额外的字符,即它更长。只有“O”等于“O”。 - SteveP
4
将其视为小数位数,BETWEEN 33 AND 135将返回 135,但不包括 135.5。 - Igor Jerosimić

2

尝试使用正则表达式(REGEX)

  WHERE  food_name REGEXP '^[G-O]';

这将为您提供所有以G开头直到以O开头的食品名称。 此处演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接