无法在oracle中使用BETWEEN

时间:2010-03-07 20:56:16

标签: sql oracle

我无法做到这一点:介于消除使用> =和< =

之间

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

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 个答案:

答案 0 :(得分:2)

我很确定这与您的语法以及与数据库设置有关的一切都无关。我重新创建了你的测试场景,和其他人一样,对于任何一个返回你期望的结果的查询都没有问题。您是否检查过前面提到的NLS_SESSION_PARAMETERS?

答案 1 :(得分:2)

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

亲眼看看:

SELECT CASE WHEN 'a' = 'A' THEN 'string comparison is case insensitive'
            WHEN 'a' <> 'A' THEN 'string comparison is case sensitive'
       END 
FROM dual;

答案 2 :(得分:2)

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

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

" Bob"
" Mac"

使用trim功能检查是否会导致问题:

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
    

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

也应该返回所有三行 - 我只是使用你的例子验证它是这样做的。你确定你做的测试正确吗?也许您在其他会话中插入数据并且没有提交额外的行?

答案 5 :(得分:0)

Nut 100%肯定它,但因为它只有3行,你可以尝试一下:

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