2013-03-30 12 views
10

BETWEEN viene utilizzato utilizzato in una clausola WHERE per selezionare un intervallo di dati tra due valori.
Se sono corretto se l'endpoint dell'intervallo è escluso o meno è specifico per DBMS.
Quello che non riesco a capire il seguente:
Se ho una tabella di valori e faccio la seguente query:SQL TRA per il testo rispetto ai valori numerici

SELECT food_name FROM health_foods WHERE calories BETWEEN 33 AND 135;

la query restituisce i risultati righe compreso calorie = 33 e calorie = 135 (ovvero i punti finali di gamma sono inclusi).

Ma se faccio:
SELECT food_name FROM health_foods WHERE food_name BETWEEN 'G' AND 'O';

faccio non ottenere righe con food_name a cominciare O. Cioè la fine dell'intervallo è escluso.
per la query per funzionare come previsto digito:
SELECT food_name FROM health_foods WHERE food_name BETWEEN 'G' AND 'P';

La mia domanda è perché c'è una tale differenza per BETWEEN per i numeri ei dati di testo?

+0

possibile duplicato di [SQL Tra clausola con le stringhe colonne] (http://stackoverflow.com/questions/5980783/sql-between-clause-with-strings-columns) – Kermit

risposta

14

Tra sta funzionando esattamente allo stesso modo per i numeri e per le stringhe di caratteri. I due endpoint sono inclusi. Questo fa parte dello standard ANSI, quindi è come funzionano tutti i dialetti SQL.

L'espressione:

where num between 33 and 135 

corrisponderà quando num è 135. non corrisponderà quando il numero è 135,00,001 mila.

Allo stesso modo, l'espressione:

where food_name BETWEEN 'G' AND 'O' 

corrisponderà 'O', ma non qualsiasi altra stringa che inizia con 'O'.

Una volta che kludge deve utilizzare "~". Questo ha il grande valore di 7-bit ASCII, quindi per applicazioni in lingua inglese, di solito funziona bene:

where food_name between 'G' and 'O~' 

Si può anche fare varie altre cose.Qui ci sono due idee:

where left(food_name, 1) between 'G' and 'O' 
where food_name >= 'G' and food_name < 'P' 

Il punto importante, però, è che between funziona allo stesso modo a prescindere dal tipo di dati.

1

provare questo con REGEX

WHERE food_name REGEXP '^[G-O]'; 

questo ti dà tutto inizia food_name wich da G fino a coloro che inizia con O

DEMO HERE

5

Prendiamo l'esempio di 'Orange' contro 'O '. La stringa 'Orange' non è chiaramente uguale alla stringa 'O', e poiché è più lunga, deve essere maggiore, non inferiore a.

Si potrebbe fare 'Orange' < 'OZZZZZZZZZZZZZZ' però.

+0

Non capisco la tua answer.WHat fare vuoi dire che 'Orange' non è uguale a' O'? 'Orange' inizia con' O' – Cratylus

+0

La stringa 'Orange' non è uguale alla stringa 'O' perché ha caratteri extra, Ie è più lungo Solo 'O' è uguale a 'O'. – SteveP

+4

@Cratylus Consideralo come un numero decimale, TRA 33 E 135 restituirebbe 135 ma non 135.5 –

Problemi correlati