我无法做到这一点:介于消除使用> =和< =
之间...但是当我尝试这个查询时:
SELECT *
FROM names
WHERE name >= 'Ankit'
AND name <= 'P'
...它给出了输出:
name
------
Ankit
Mac
Bob
当我尝试时:
SELECT *
FROM names
WHERE name BETWEEN 'Ankit' AND 'P'
...它给出了输出:
name
------
Ankit
你能解释一下这个原因吗?
答案 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'
如果这样做无效,请检查数据库的语言和排序顺序是否正确。
修改强>
由于上述建议无法解决您的问题,您可以尝试以下方法:
也许你在字段中有其他一些不可打印的字符。使用Oracle DUMP
函数检查:
SELECT DUMP(name), name FROM names
你应该得到这样的东西:
Typ=1 Len=3: 66,111,98 Bob
...
验证Len
长度是否正确。
检查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")