【问题标题】:SQL BETWEEN for text vs numeric values文本与数值的 SQL BETWEEN
【发布时间】:2013-03-21 04:47:33
【问题描述】:

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 开头。 IE。范围的末尾被排除
为了让查询按预期工作,我输入:

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

我的问题是,为什么 BETWEEN 对于数字和文本数据会有如此大的差异?

【问题讨论】:

标签: mysql sql numbers varchar between


【解决方案1】:

REGEX试试这个

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

这将为您提供所有以 G 开头的食物名称,直到以 O 开头的食物名称

DEMO HERE

【讨论】:

    【解决方案2】:

    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 的工作方式与数据类型无关。

    【讨论】:

      【解决方案3】:

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

      你可以做 'Orange'

      【讨论】:

      • 我不明白你的回答。你的意思是Orange 不等于OOrangeO 开头
      • 字符串 'Orange' 与字符串 'O' 不同,因为它有额外的字符,即它更长。只有“O”等于“O”。
      • @Cratylus 将其视为小数位,BETWEEN 33 AND 135 将返回 135 但不是 135.5
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多