代码之家  ›  专栏  ›  技术社区  ›  Ankit Sachan

无法在Oracle中使用between

  •  0
  • Ankit Sachan  · 技术社区  · 16 年前

    我无法解释: between取消使用>=和<。=

    …但是当我尝试这个查询时:

    SELECT *  
      FROM names 
     WHERE name >= 'Ankit' 
       AND name <= 'P'
    

    …输出:

    name
    ------
    Ankit
    Mac
    Bob
    

    当我尝试:

    SELECT *  
      FROM names  
     WHERE name BETWEEN 'Ankit' AND 'P'
    

    …输出:

    name
    ------
    Ankit
    

    你能解释一下为什么吗?

    6 回复  |  直到 16 年前
        1
  •  2
  •   zendar    16 年前

    首先,Oracle varchar2类型区分大小写。

    其次,检查名称开头是否有空格,如下所示:

    " Bob"
    " Mac"
    

    使用微调功能检查是否导致故障:

    SELECT *  
    FROM names  
    WHERE trim(name) BETWEEN 'Ankit' AND 'P'
    

    如果这不起作用,请检查数据库的语言和排序顺序是否正确。

    编辑:
    由于上述建议没有解决您的问题,您可以尝试以下方法:

    1. 也许您在字段中还有一些其他不可打印的字符。使用Oracle DUMP 要检查的功能:

      SELECT DUMP(name), name FROM names
      

      你应该得到这样的信息:

      Typ=1 Len=3: 66,111,98   Bob
      ...
      

      验证 Len 长度正确。

    2. 检查NLS参数,使其不会意外更改为不适用于您的数据库的内容:

      SELECT * FROM NLS_SESSION_PARAMETERS
      SELECT * FROM NLS_DATABASE_PARAMETERS
      SELECT * FROM NLS_INSTANCE_PARAMETERS
      

      检查这三个查询的结果,并验证排序、语言和字符集上的参数是否正确。

        2
  •  2
  •   pierre    16 年前

    我很确定这与您的语法和您的数据库设置无关。我已经重新创建了您的测试场景,和其他人一样,返回预期结果的查询都没有问题。如前所述,您是否检查了您的nls_会话参数?

        3
  •  2
  •   jva    16 年前

    SQL 代码 不区分大小写。 字符串值和字符串比较区分大小写。

    自己看看:

    SELECT CASE WHEN 'a' = 'A' THEN 'string comparison is case insensitive'
                WHEN 'a' <> 'A' THEN 'string comparison is case sensitive'
           END 
    FROM dual;
    
        4
  •  0
  •   cagcowboy    16 年前

    您似乎在顶部查询中使用了小写的“p”,在第二个查询中使用了大写的“p”。这是故意的吗?

        5
  •  0
  •   Raimonds Simanovskis    16 年前
    SELECT *  
    FROM names  
    WHERE name BETWEEN 'Ankit' AND 'P'
    

    还应该返回所有三行-我刚刚用您的示例验证了它是否返回。你确定你做的测试是正确的吗?也许您在其他会话中插入了数据,但没有提交其他行?

        6
  •  0
  •   Ervin    16 年前

    螺母100%肯定,但因为它只有3行,你可以尝试它:

    SELECT *  
      FROM names  
     WHERE (name BETWEEN "Ankit" AND "P")
    OR (name BETWEEN "ankit" AND "p")