Nachtrag: Ich habe in der Dokumentation verschiedener Datenbanksysteme nachgelesen:
- Bei SQLite3 kann man wirklich alles miteinander per < oder <= vergleichen, im Zweifelsfall wird binär per
memcmp verglichen, aber auf jeden Fall ist der Vergleich immer konsistent mit einer
ORDER BY-Klausel. Man kann insbesondere nicht nur hinter
ORDER BY sondern auch hinter jeden Ausdruck mit Vergleichsoperator eine
COLLATE-Klausel setzen, um die Vergleichsfunktion explizit festzulegen.
- PostgreSQL kann mit
ORDER BY alle Datentypen sortieren, für die eine B-Tree-Operatorklasse definiert ist. Man
kann also einen benutzerdefinierten Datentyp erzeugen, auf dem < oder <= nicht oder inkonsistent mit der B-Tree-Operatorklasse definiert sind. Für alle eingebauten Datentypen gilt aber, dass sie sich entweder mit
ORDER BY und < oder <= konsistent vergleichen lassen, oder gar nicht.
- Bei MySQL habe ich leider in der Dokumentation und mittels Google keine Informationen darüber gefunden, wie die Vergleiche genau funktionieren. Ein kurzes Experiment legt aber nahe, dass bei Stringvergleichen ähnlich wie bei SQLite3 auch hier eine Sortierreihenfolge angegeben werden kann und alle Datentypen, die man mit
ORDER BY sortieren kann auch mit den Vegleichsoperatoren konsistent verglichen werden können.
Ich wage daher zu behaupten, dass man mit meinem Ansatz keine Probleme bekommen sollte, solange man immer gleiche Datentypen miteinander vergleicht. Wenn Konversionen zum Tragen kommen, was hier nicht der Fall sein dürfte, verhalten sich die verschiedenen Datenbanken wieder etwas weniger einheitlich.
When C++ is your hammer, every problem looks like your thumb.