2013-03-30 8 views
10

BETWEEN wird in einer WHERE-Klausel verwendet, um einen Datenbereich zwischen zwei Werten auszuwählen.
Wenn ich richtig bin, ob der Endpunkt des Bereichs ausgeschlossen ist oder nicht, ist DBMS-spezifisch.
Was kann ich nicht verstehen, in der folgende:
Wenn ich eine Tabelle mit Werten haben und ich die folgende Abfrage:SQL BETWEEN für Text und numerische Werte

SELECT food_name FROM health_foods WHERE calories BETWEEN 33 AND 135;

Die Abfrage gibt als Ergebniszeilen einschließlich Kalorien = 33 und Kalorien = 135 (dh Bereichsendpunkte sind enthalten).

Aber wenn ich tun:
SELECT food_name FROM health_foods WHERE food_name BETWEEN 'G' AND 'O';

ich nicht bekommen Reihen mit food_name mit O beginnen. I.e. Das Ende des Bereichs ist ausgeschlossen.
Für die Abfrage wie erwartet funktionieren Ich tippe:
SELECT food_name FROM health_foods WHERE food_name BETWEEN 'G' AND 'P';

Meine Frage, warum gibt es eine solche Differenz für BETWEEN für Zahlen und Textdaten?

+0

mögliche Duplikate von [SQL Between-Klausel mit Zeichenfolgen Spalten] (http://StackOverflow.com/Questions/5980783/SQL-between-Clause-with-strings-columns) – Kermit

Antwort

14

Between funktioniert genau so wie Nummern und Zeichenketten. Die beiden Endpunkte sind enthalten. Dies ist Teil des ANSI-Standards, so dass alle SQL-Dialekte funktionieren.

Der Ausdruck:

where num between 33 and 135 

wird übereinstimmen, wenn num ist 135. Es wird nicht übereinstimmen, wenn die Anzahl 135,00001 ist.

Auch der Ausdruck:

where food_name BETWEEN 'G' AND 'O' 

wird 'O', entspricht aber nicht anderer Zeichenfolge mit 'O' beginnen.

Einmal einfache Kludis ist "~" zu verwenden. Dies hat den größten 7-Bit-ASCII-Wert, so dass für englischsprachige Anwendungen, es funktioniert in der Regel gut:

where food_name between 'G' and 'O~' 

Sie auch verschiedene andere Dinge tun können.Hier sind zwei Ideen:

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

Der wichtige Punkt ist jedoch, dass between funktioniert auf die gleiche Art und Weise unabhängig vom Datentyp.

1

versuchen, diese mit REGEX

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

das gibt Ihnen alle food_name wich beginnt von G bis diejenigen, die durch O beginnt

DEMO HERE

5

Nehmen wir das Beispiel von 'Orange' vs. ‚O ". Die Zeichenfolge 'Orange' ist eindeutig nicht gleich der Zeichenfolge 'O', und wie es länger ist, muss es größer sein, nicht weniger als.

Sie könnten 'Orange' < 'OZZZZZZZZZZZZ' obwohl tun.

+0

Ich verstehe Ihre Antwort nicht.Was tun Sie meinen "Orange" ist nicht gleich "O"? "Orange" beginnt mit "O" – Cratylus

+0

Die Zeichenfolge "Orange" ist nicht die gleiche wie die Zeichenfolge "O", da sie zusätzliche Zeichen enthält, dh es ist länger. Nur 'O' ist gleich 'O'. – SteveP

+4

@Cratylus Stellen Sie es sich als Dezimalstellen vor, ZWISCHEN 33 UND 135 würden 135 aber nicht 135,5 zurückgeben –