oracle中'between'运算符的不同行为

时间:2014-05-19 09:11:52

标签: sql oracle

我知道'之间'运算符包含指定的范围..但在下面的情况下,它的工作方式不同

我的表客户具有以下属性。

  customer 
    {
     customername  varchar2(30),
      custid  integer(10,0)

    }

查询

   select *  from customer c where  c.customername between  'a'  and 'b';

以上查询仅提取数据客户名称以' a'开头。但 当我们使用'之间在这种情况下,具有数字的运营商都是包容性的。任何人都可以向我解释这个行为。

2 个答案:

答案 0 :(得分:7)

它并没有什么不同。 BETWEEN仍然具有包容性。但是你应该记住,编程中的字符串比较比整数比较稍微复杂一点。在数据库中,字符串的排序如下:

'a' < 'andy' < 'andy1' < 'anna' < 'b' < 'boris' < 'brian'.

所以between 'a' and 'b'将返回:

'a', 'andy', 'andy1', 'anna', 'b' 

但是,由于您没有一个名为'b'的客户,您只能得到:

'a', 'andy', 'andy1', 'anna' 

如果您只想要名称以a或b开头的客户,请使用SUBSTR

select *  from customer c where  SUBSTR(c.customername, 1, 1) between  'a'  and 'b';

答案 1 :(得分:4)

BETWEEN运算符充当:

  

的价值
expr1 BETWEEN expr2 AND expr3
     

是布尔表达式的值:

expr2 <= expr1 AND expr1 <= expr3

对于字符串和数字,它的工作方式相同,但你必须对字符串考虑更多。

特别是:

 'a'  <= 'b' // true
 'ab' <= 'b' // true
 'b'  <= 'b' // true
 'ba' <= 'b' // FALSE

如果您的数据集中的客户名称与b完全相同,则between查询会返回该客户。但是bob不会被返回,因为'bob' <= 'b'是假的。