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

sar*_*sar 2 sql oracle

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

我有表客户具有以下属性.

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

    }
Run Code Online (Sandbox Code Playgroud)

询问

   select *  from customer c where  c.customername between  'a'  and 'b';
Run Code Online (Sandbox Code Playgroud)

以上查询仅提取数据,以"a"开头的客户名称.但是当我们使用'between'运算符和数字时,两者都是包容性的.任何人都可以向我解释这个行为.

Rus*_*Bes 7

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

'a' < 'andy' < 'andy1' < 'anna' < 'b' < 'boris' < 'brian'.
Run Code Online (Sandbox Code Playgroud)

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

'a', 'andy', 'andy1', 'anna', 'b' 
Run Code Online (Sandbox Code Playgroud)

但是,由于您没有完全命名的客户,因此'b'您只得到:

'a', 'andy', 'andy1', 'anna' 
Run Code Online (Sandbox Code Playgroud)

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

select *  from customer c where  SUBSTR(c.customername, 1, 1) between  'a'  and 'b';
Run Code Online (Sandbox Code Playgroud)