SQL BETWEEN文本VS数值(SQL BETWEEN for text vs numeric

2019-08-18 08:14发布

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数字和文本数据?

Answer 1:

之间运行的确切数字和字符串一样。 两个端点包括在内。 这是ANSI标准的一部分,所以它是所有SQL方言是如何工作的。

表达方式:

where num between 33 and 135

当num是135时数为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不管数据类型的方式是相同的。



Answer 2:

采取“橙”与“O”的例子。 字符串“橙”显然不等于字符串“O”,并且因为它是更长的时间,它必须是更大的,不小于。

你可以做“橙” <“OZZZZZZZZZZZZZZ”虽然。



Answer 3:

试试这个用REGEX

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

这给你所有food_name至极开始由G直到那些谁被O开始

DEMO这里



文章来源: SQL BETWEEN for text vs numeric values