15

BETWEENWHERE子句中用于选择两个值之间的数据范围。
如果我是正确的,是否排除范围的端点是 DBMS 特定的。
我无法理解以下内容:
如果我有一个值表并且我执行以下查询:

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';

没有food_name以 .开头的行O。即范围的末尾被排除在外
为了使查询按预期工作,我键入:

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

我的问题是为什么BETWEEN数字和文本数据有这样的差异?

4

3 回答 3

22

对于数字和字符串,Between 的操作方式完全相同。包括两个端点。这是 ANSI 标准的一部分,因此它是所有 SQL 方言的工作方式。

表达方式:

where num between 33 and 135

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

同样,表达式:

where food_name BETWEEN 'G' AND 'O'

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

Once simple kludge is to use "~". This has the largest 7-bit ASCII value, so for English-language applications, it usually works well:

where food_name between 'G' and 'O~'

You can also do various other things. Here are two ideas:

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

The important point, though, is that between works the same way regardless of data type.

于 2013-03-30T16:55:16.527 回答
5

以“Orange”与“O”为例。字符串 'Orange' 显然不等于字符串 'O',因为它更长,所以它必须更大,而不是小于。

你可以做 'Orange' < 'OZZZZZZZZZZZZZZ' 虽然。

于 2013-03-30T16:46:44.230 回答
2

试试这个REGEX

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

这给了你所有以 G 开头的 food_name 直到那些以 O 开头的食物

在这里演示

于 2013-03-30T16:45:55.833 回答