2014-05-19 4 views
1

Я знаю, что «между» оператор включен для диапазонов specified..but в следующем случае он работает по-другомуразличного поведения «между» оператором в оракуле

У меня есть таблица клиент со следующими атрибутами.

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

    } 

Запрос

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

Над запрос извлекает данные только имя клиента, начиная с 'а'. Но , когда мы используем оператор «между» с номером, в этом случае оба включены. Может ли кто-нибудь объяснить мне этот bahvior.

+0

Попробуйте вставить клиента, чье имя точно «b». Посмотрите, сможете ли вы это понять. – Mat

+0

@Mat, если я меняю запрос между 'a' и 'c' .. он будет извлекать результат, начиная с a и b..i, чтобы узнать, почему между поведением оператора отличается ... – sar

ответ

6

Это не так. 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'; 
+0

Педагогический ответ. – user2672165

4

В BETWEEN оператор действует как:

и значением

expr1 BETWEEN expr2 AND expr3 

является значение логического выражения:

expr2 <= expr1 AND expr1 <= expr3 

Он работает так же, как для символьные строки, как для чисел, но вы должны думать об этом немного больше r строк.

В частности:

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

Если у вас есть клиент с именем точно b в наборе данных, оно будет возвращено вашим between запроса. Но bob не будет возвращен, потому что 'bob' <= 'b' является ложным.

Смежные вопросы