SQLite Select "formulieren"

SlaterTh90

Lt. Commander
Registriert
Nov. 2014
Beiträge
1.852
Hallo CB-Forum,
kann mir mal wer kurz weiterhelfen. Ich hab jetzt eine Datenbank (SQLite) und möchte sortiert ausgeben. Beispiel:

USB-Sticks, einer hat 512 GB und einer 512 MB. Die Werte (512) sind getrennt von der Einheit gespeichert (GB,MB). Wie kann man jetzt die SELECT xxx FROM USBSTICKS Anweisung so formulieren das man die richtig sortiert bekommt? (Also das 512 MB kleiner ist als 512 GB)

Alternativ könnte ich auch die MB,KB usw durch Zahlen ersetzen, wenn das einfacher wäre (denke ich mal). Noch besser ist es aber wenns so geht ^^
 
Es wäre besser wenn du die Werte ohne Angabe der Einheit speicherst. Also bspw. 512 MB als Byte (512 * 1000 * 1024), das kannst du dann sortieren und über deinen View wieder in die gewünschte Form bringen.
 
SELECT * FROM tabellen_name ORDER BY spalten_name ASC|DESC
ASC für Aufsteigend, DESC für Absteigend.

Mit konkreten Zahlenwerten wäre das Eindeutig.

Falls die Einheiten in einer Separaten Spalte stehen:

SELECT * FROM tabellen_name WHERE einheit LIKE 'GB' ORDER BY DESC UNION SELECT * FROM tabellen_name WHERE einheit LIKE 'MB' ORDER BY DESC;

Damit ziehst du dir zuerst alle GB werte und hängst quasi alle MB werte an.

Den Order by befehl müsstest du natürlich noch auf die Speichergrößen-Spalte beziehen. Falls es noch weitere Spalten gibt.
 
Zuletzt bearbeitet:
Das was du willst kannst du auf 2 Arten lösen:

1) Du müsstest du ein Kriterium schaffen, wie z.B. eine "Gewichtung" abgebildet in einer speziellen Tabelle wo MB einen "höheren" Stellenwert hat als GB (oder umgekehrt, je nachdem was zuerst kommen soll).

2) Du fügst eine zusätzliche Spalte ein wo du die Größe in einer einheitlichen Form reinschreibst (z.B. Größe in KB, die du als Sortierkriterium verwendest und halt nicht anzeigen lässt.

In der Praxis ist aber beides Mist. Benenne die Spalte für die Größe einfach auf was sinnvolles wie Size_MB, setz einen entsprechenden Datentypen und schreib die Größen dort in einer Maßeinheit für alles ab. Spart Lösung 1 und 2 und in deinem Fall sogar noch die Spalte mit der Größenbezeichnung.
 
Zuletzt bearbeitet:
Man kann darüber streiten ob es besser wäre, die Größe einheitenunabhängig zu speichern. Es kommt dabei sehr stark auf die Anwendung an, die die Daten erzeugt.
Wenn sie nun mal so wie beschrieben vorligen kann man durchaus die Umrechnung auch im order by vornehmen, nämlich wie folgt:

Code:
select * 
  from usbsticks
 order by case 
            when einheit = 'KB' then 1024
            when einheit = 'MB' then 1024 * 1024
            when einheit = 'GB' then 1024 * 1024 * 1024
            when einheit = 'TB' then 1024 * 1024 * 1024 * 1024
          end * groesse

Je nach Datentyp der Spalte groesse kann es notwendig sein noch einen typecast zu machen, um einen Überlauf zu vermeiden, dann würde die letzte Zeile also lauten:

Code:
          end * cast (groesse as bigint)
 
Ich glaube dann mach ich das echt als MB oder KB fest. Das andere ist relativ komplex. Danke für die vielen Antworten.
 
Ja, das ist auch deutlich besser so. Einheiten - und insbesondere Namen der Einheiten - haben in einer Tabelle, die vergleichbare und sortierbare Werte speichern soll, einfach nichts verloren, das ist schlechtes Design. Wird spätestens dann deutlich, wenn du nach 4 GB-Sticks suchst, dann aber nur die Hälfte der Ergebnisse findest, weil die andere Hälfte mit 4096 MB angegeben ist - oder wenn ein Anwender "MHz" oder "Brötchen" in die Einheiten-Spalte schreibt.

Lass die Formatierung die Anwendung machen und lege Daten in der Datenbank in einem Format ab, welches möglichst einfache Weiterverarbeitung erlaubt, und alle sind glücklich.
 
Wie bereits erwähnt wurde, sehr viel sinnvoller ist es den realen Speicherwert in Form von xxxxxxx Bytes in der DB abzulegen. Die Darstellung (View) mit "X MB" oder "X GB" sollte die darauf zugreifende Anwendung machen.
 
Zurück
Oben