我有一张employee
表,其中包含以下记录。
EID ENAME RESIDENCE
1000 Sanit Orissa
1001 Sachi Tamilnadu
1002 Sampath Karnataka
1006 Pradeep MP
我正在玩Oracle SQL的BETWEEN
运算符。
查询-1
select * from employee where substr(RESIDENCE,1,1) between 'E' and 'T';
当我检查第一个字符是否在两个字符之间时,它按预期工作,但如果我将文本传递给BETWEEN
运算符(请参阅查询2和3),我不明白它是如何工作的?
查询-2 select * from employee where RESIDENCE between 'E' and 'T';
**RESULT**
EID ENAME RESIDENCE
1000 Sanit Orissa
1002 Sampath Karnataka
1006 Pradeep MP
查询-3 select * from employee where RESIDENCE between 'Orissa' and 'MP';
**RESULT**
0 rows
我看到oracle文档说
expressions must be numeric, character, or datetime expressions
。但我的查询2和3运行没有任何错误。谁能解释一下这里到底发生了什么?
答案 0 :(得分:1)
来自oracle文档:
关系运算符逐字节地比较两个输入字符串,类似于C库例程strcmp(3C)。每个字节使用ASCII字符集中对应的整数值进行比较,如ascii(5)所示,直到读取空字节或达到最大字符串长度。
所以,在这种情况下,奥里萨邦'大于' E'但是,那就不那么了。
。关于您的第三个请求。在between
子句,第一个参数必须是最低的,第二个参数必须是最高的。但在您的样本中,最低值和最高值相反。
答案 1 :(得分:1)
select * from employee where RESIDENCE between 'E' and 'T'
它检查E
和T
之间的所有单个字符,以便它返回
Orissa
Karnataka
MP
因为每个字符都介于E
和T
select * from employee where RESIDENCE between `Orissa` and `MP`
此处,Orissa
和MP
之间没有任何名称,所以如果我将此条件更改为Erissa
和TP
,则会返回< / p>
Orissa
Tamilnadu
Karnataka
MP
答案 2 :(得分:1)
对于查询2,状态为Tamilnadu的行未到,因为您已将条件提及为:
residence between 'E' and 'T'
你可以说'Tamilnadu' > 'T'
,这就是它没有被选中的原因。如果条件是:
residence between 'E' and 'Tamilnadu'
然后它会起作用。
查询3未返回任何内容,因为您已将条件提及为:
RESIDENCE between 'Orissa' and 'MP'
其中'Orissa' >'MP'
,因此在此范围之间没有居住地,如在{x}之前的and
之前的值应该小于and
之后的值。
希望它可以帮到你