SQL BETWEEN用于文本与数值

时间:2013-03-30 16:43:43

标签: mysql sql numbers varchar between

BETWEEN子句中使用

WHERE来选择两个值之间的数据范围 如果我是正确的,是否排除范围的终点是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存在这样的差异?

3 个答案:

答案 0 :(得分:18)

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

表达式:

where num between 33 and 135
当num为135时,

将匹配。当数字为135.00001时,它将不匹配。

同样,表达式:

where food_name BETWEEN 'G' AND 'O'

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

一旦简单的kludge使用“〜”。它具有最大的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的工作方式都相同。

答案 1 :(得分:5)

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

你可以做'橙色'&lt; 'OZZZZZZZZZZZZZZ'虽然。

答案 2 :(得分:2)

使用REGEX

尝试此操作
  WHERE  food_name REGEXP '^[G-O]';

这将为你提供所有从G开始的food_name,直到那些以O开头的人。

DEMO HERE