Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi String richtig sortieren (https://www.delphipraxis.net/185119-string-richtig-sortieren.html)

Walter Landwehr 16. Mai 2015 18:07

Datenbank: Firebird • Version: 2.5.4 • Zugriff über: IBO

String richtig sortieren
 
Hallo,

Ich habe in einer Tabelle ein Feld als Varchar deklariert. Hier drin stehen unter anderem folgende Werte:

1
10
2
3
30
3a
10.1
2a
2b
usw.

Wie bekomme ich es hin das die Reihenfolge wie folgt aussieht.

1
2
2a
2b
3
10
10.1
30

Habt Ihr da eine Lösung?

in Excel gibt es die Lösung: Alles was wie eine Zahl aussieht als Zahl formatieren.

Danke schon mal im voraus. Ein Hilfsfeld wäre auch kein Problem. Habe ich eh schon angelegt.

mkinzler 16. Mai 2015 18:22

AW: String richtig sortieren
 
Machs doch genauso

SQL-Code:
select
   <Feldliste>
from
  <Tabelle>
order by
  cast( <Spalte> as BigInt);

himitsu 16. Mai 2015 18:24

AW: String richtig sortieren
 
Excel nutzt standardmäßig ein "NaturalSort", ebenso wie der Explorer.

Aber standardmäßig wird fast immer nur der Typ sorttiert, also bei Integern/Floats geht es (solange sie nicht als String sortiert werden)
und bei Strings werden die Chars meistens Ordinal sortiert. (bei Datenbanken manchmal aber auch noch mit einer deklarierten CodePage dazwichen, siehe "Collation")

Eine Funktion ala "NaturalSort" zerlegt den String in Einzelteile und vergleicht "nummerische Anteile" als Zahl und nicht als String.

Ob/Wo sich soeine Funktion bei dir versteckt ... Bei Google suchenFirebird naturalsort


[edit]
@mkinzler: Bei "3a" wird aber bestimmt nicht so ganz richtig funktionieren?
Aber bei den Beispielwerten könnte man "a", "b", "c" usw. auch in Nachkommastellen übersetzen (a=.01, b=.02 ... z=.26) und dann mit dem NUMERIC-CAST arbeiten.

Perlsau 16. Mai 2015 20:47

AW: String richtig sortieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Walter,

hab da eben mal ein wenig mit herumgespielt. Die Lösung von MKinzler funktioniert nicht, weil die Spalte nicht nur Ziffern enthält. Die Idee mit der Hilfs-Spalte führt dagegen zum Ziel:

Code:
CREATE TABLE TABTEST (
    ID_TABTEST INTEGER NOT NULL,
    NUMMER     VARCHAR(10) DEFAULT '' NOT NULL COLLATE UNICODE,
    WERT       NUMERIC(5,2) DEFAULT 0
Gehen wir mal davon aus, daß in deiner Spalte NUMMER die ursprüglichen Werte stehen. Nun legst du eine zweite Tabelle des Typs Numeric an und verschiebst dorthin die Ziffern-Anteile des Strings aus der Nummernspalte, so daß in NUMMER nur noch a, b oder '' steht, in der Wertespalte dagegen 1, 10.1 usw. Danach kannst du das ganze so ausgeben, wie du es dir vorgestellt hast

Zitat:

select Wert,Nummer from TABTEST order by Wert, Nummer

p80286 17. Mai 2015 04:53

AW: String richtig sortieren
 
Entschuldigt, da geht mir der Hut hoch!
Entweder der Feldinhalt ist numerisch oder ein Text. da sollte man sich vorher entscheiden und dementsprechend sortieren. Erreicht man das gewünschte Ergebnis nicht, könnten z.B. führende Nullen weiter helfen. Kommt man so immer noch nicht zum Ziel, stellt sich die Frage ob das gewählte Format überhaupt das richtige ist.

Gruß
K-H

Perlsau 17. Mai 2015 06:41

"Wort zum Sonntag"
 
Zitat:

Zitat von p80286 (Beitrag 1301778)
Entschuldigt, da geht mir der Hut hoch! Entweder der Feldinhalt ist numerisch oder ein Text. da sollte man sich vorher entscheiden und dementsprechend sortieren. Erreicht man das gewünschte Ergebnis nicht, könnten z.B. führende Nullen weiter helfen. Kommt man so immer noch nicht zum Ziel, stellt sich die Frage ob das gewählte Format überhaupt das richtige ist.

Mal davon abgesehen, wie sinnvoll oder -los das Anliegen des TE ist: eine derart emotionale Beteiligung am Programmierstil eines Forenmitglieds, mit dem du vermutlich weder Projekte gemeinsam umsetzen noch dessen Anwendungen benutzen mußt, hilft weder dem TE noch dir selbst und läßt auch sonst keinen nennenswerten Nutzen erkennen ... :roll:

Es spricht ja im Grunde nichts dagegen, den eigenen Programmierstil insgeheim für den weltweit besten zu halten. Das tun hier offenbar viele, sollte aber deren Privatvergnügen bleiben bzw. ihren eigenen selbstedukatorischen Zwecken dienen. Doch anderen ihren eigenen Stil auf diese Weise madig machen zu wolllen, indem man eine starke emotionale Reaktion ("mir geht der Hut hoch" impliziert Wut oder Zorn, zumindest aber große Verärgerung) demonstriert, um damit beim Gegenüber eine entsprechende Reaktion hervorzurufen, ist meines Empfindens nach nicht wirklich angebracht, zumal nicht nur in diesem Fall jegliche Sachargumentation vollständig ausbleibt.

Wie mir einmal Daniel – absolut berechtigt – auf eine ähnliche Reaktion meinerseits erwiderte, vergrault man damit empfindsame User, und das macht ja nun wohl gar keinen Sinn. Aus meiner Sicht empfiehlt es sich daher, die Themen hier und auch in anderen Foren mit dem gebührenden emotionalen Abstand zu betrachten, und wenn das nicht gelingt, die daraus resultierenden unkontrollierbaren Reaktionen für sich zu behalten. Man trägt sonst lediglich die eigenen innere Konflikte an Leute heran, die damit nicht das Geringste zu tun haben und daher auch nichts damit anzufangen wissen – außer eben emotional darauf zu reagieren ... und wohin das führt, wissen wir alle nur zu gut.

Ich weiß aus eigener Erfahrung ziemlich genau, worüber ich hier schreibe.
_________________________________

Und nun zurück zum Thema:

Welche Anforderungen beim TE genau vorliegen bzw. weshalb er in seiner Tabelle diese Werte genau so stehen hat oder haben muß, wissen wir nicht. Fakt ist jedoch erst einmal, daß er diese Tabellen-Inhalte so, wie sie nunmal vorliegen, zu sortieren wünscht. Mir fällt im Augenblick außer der genannten Methode keine weitere ein, die das Problem des TE zu lösen imstande wäre.

Ich hatte einmal ein ähnliches Problem, da wollte der Kunde Artikelnummern, die stets mit Buchstaben begannen und mit Ziffern endeten, auf dieselbe Weise sortiert haben. Das war nur zu machen, indem man Buchstaben- und Ziffernanteile in zwei Spalten verwaltete und diese bei Reports wieder zusammensetzte. Vielleicht klärt uns ja der TE noch darüber auf, was genau dahintersteckt, wäre aber für die Lösung des Problems nicht unbedingt notwendig.

Dejan Vu 17. Mai 2015 07:34

AW: String richtig sortieren
 
Meistens ist es im echten Leben so, das man sich die Gegebenheiten nicht aussuchen kann, sondern sich mit ihnen arrangieren muss. Hier ist es eben so, das eine Spalte nach bestimmten Regeln sortiert werden muss, die sich nicht so ohne weiteres umsetzen lassen.

Da muss man durch.

PS: Auch zum Thema: Muss es eine Firebird/DB-Lösung sein? Das ist nicht so leicht. In Delphi schreibt man einfach eine Vergleichsfunktion und kann das dann mal eben schnell sortieren.

Walter Landwehr 17. Mai 2015 08:27

AW: String richtig sortieren
 
Es handelt sich hierbei um ein Gebührenverzeichnis für Heilpraktiker. Leider hat man 1987, so alt ist das Verzeichnis, nicht an EDV gedacht. Man möchte aber die Sortierung so haben wie Sie in Buchform gedruckt ist.

Ich weiß nicht welcher Dämon hier p80286 ergriffen hat, so emotional zu reagieren. Ich hatte nicht die Absicht hier eine sinnlose Diskussion loszutreten sondern habe lediglich um eine Lösung gebeten. Ich hätte vielmehr von p80286 eine vernünftige Lösung erwartet, als sich hier völlig daneben zu benehmen.

Ich werde mal den Vorschlag von Perlsau testen und über das Ergebnis berichten.

Sir Rufo 17. Mai 2015 09:10

AW: String richtig sortieren
 
Diese Art der Daten wird eben von keinem Standard-Sortierer abgedeckt.

Wenn man diese Daten mal aufbricht, dann hat man so etwas
Delphi-Quellcode:
TFoo = record
  Section: array of integer;
  SubSection: string;
end;
Somit müsste ein immer korrekt funktionierender Sortier-Algorithmus vorher den Wert parsen und dann nach den einzelnen Teilen sortieren.

Eine immer korrekt funktionierende Sortierung für diese Daten kann also nur in der Anwendung selber erfolgen oder man erstellt sich eine UDF, die den Wert sortierfreundlich umwandelt.
Code:
1    => 001
10   => 010
2    => 002
3    => 003
30   => 030
3a  => 003 a
10.1 => 010.001
2a  => 002 a
2b  => 002 b

Rollo62 17. Mai 2015 09:21

AW: String richtig sortieren
 
Spricht etwas dagegen eine weitere Spalte als Suchfeld hinzuzufügen ?
Dann müsste man nur einmal mit einem speziellen Algorithmus drüberlaufen und diese nach beliben Setzen,
danach könnte man schnell per z.B. Integer-Feld sortieren.

Rollo

mkinzler 17. Mai 2015 09:22

AW: String richtig sortieren
 
Zitat:

Zitat von Dejan Vu (Beitrag 1301782)
PS: Auch zum Thema: Muss es eine Firebird/DB-Lösung sein? Das ist nicht so leicht. In Delphi schreibt man einfach eine Vergleichsfunktion und kann das dann mal eben schnell sortieren.

Diese könnte man dann u.U. auch als UDF in FireBird benutzen.

Bernhard Geyer 17. Mai 2015 09:23

AW: String richtig sortieren
 
Zitat:

Zitat von Perlsau (Beitrag 1301770)
Hi Walter,
hab da eben mal ein wenig mit herumgespielt. Die Lösung von MKinzler funktioniert nicht, weil die Spalte nicht nur Ziffern enthält. Die Idee mit der Hilfs-Spalte führt dagegen zum Ziel:

Funktioniert aber nur bei so einfachen Konstellationen. Wir haben selbst öfter Komplexere Kombinationen. Dort führen wir die Sortierung auf Clientseite durch indem wir eine eigene Routine geschrieben haben.

Zitat:

Zitat von p80286 (Beitrag 1301778)
Entschuldigt, da geht mir der Hut hoch!
Entweder der Feldinhalt ist numerisch oder ein Text. da sollte man sich vorher entscheiden und dementsprechend sortieren.

Du kannst ja das mal einigen unserer Kunden erklären. Genau solche Kombinationen sind üblich in der realen Welt. Das beste und bekannteste Beispiel wäre wohl die Schraube M8.
Geht hier auch der Hut hoch oder ist M8 nicht doch eine vernünftige Bezeichnung?

Zitat:

Zitat von p80286 (Beitrag 1301778)
... führende Nullen weiter helfen.

Genau das macht unsere eigene Implementierung um dann diese natürliche Sortierung zu erreichen.

Captnemo 17. Mai 2015 09:41

AW: String richtig sortieren
 
Zitat:

Zitat von Rollo62 (Beitrag 1301795)
Spricht etwas dagegen eine weitere Spalte als Suchfeld hinzuzufügen ?
Dann müsste man nur einmal mit einem speziellen Algorithmus drüberlaufen und diese nach beliben Setzen,
danach könnte man schnell per z.B. Integer-Feld sortieren.

Rollo

Ich muss in meinen Projekten leider auch öfter auf Fremddaten zurückgreifen, deren Inhalt, Formatierung und Sortierung nicht meiner Kontrolle unterliegen. Da ist fast immer unmöglich einfach mal ein Feld hinzuzufügen, oder die Tabelle nach eigenen Ansprüchen zu verändern. Zum einen weiß man nicht immer welche Probleme man damit in der Erstellersoftware hervorruft, zum anderen bekommt man selten von den Entwicklern dieser Tabelle die Genehmigung oder die Unterstützung (schon gar nicht, wenn es sich dabei um größere Unternehmen handelt, wenn man denn überhaupt die Erlaubnis bekommt). Und dann passiert es sogar ab und an, dass die Erstellersoftware diese Erweiterungen der Tabelle beim nächsten Start oder der nächsten Reorganisationen mal flux wieder zu nichte macht.
Ich seh bei solchen Sachen tunlichst zu, dass ich das dies in meiner Software erledige. Ob im Speicher oder in einer eigenen DB hängt von Größe und Frequenz der Änderungen ab. Dann allerdings kann ich das so machen, wie ich will.

Walter Landwehr 17. Mai 2015 11:25

AW: String richtig sortieren
 
Hallo Rollo,

nein dagegen spricht nichts. DB und Software liegt in meiner Veantwortung.

p80286 18. Mai 2015 12:43

AW: String richtig sortieren
 
@ Dann solltest Du nach Möglichkeit die Daten "entzerren"

@
Zitat:

Zitat von Bernhard Geyer (Beitrag 1301797)
Du kannst ja das mal einigen unserer Kunden erklären. Genau solche Kombinationen sind üblich in der realen Welt. Das beste und bekannteste Beispiel wäre wohl die Schraube M8.
Geht hier auch der Hut hoch oder ist M8 nicht doch eine vernünftige Bezeichnung?

Da ich aus der "realen Kundenwelt" komme muß ich Dir teilweise Recht geben. Der andere Teil ist der der durch die Programmierer verursacht wird. Da werden dann mal gerne Informationen die unterschiedliche Eigenschaften beinhalten in einem Feld zusammgegeworfen, nach dem Motto, da kann man dann ein paar Tabellen sparen. Solange gleiche Informationen wenigstens das gleiche Format haben ist das ja noch zähneknirschend hinnehmbar, sobald aber nur eine zwischen 2 und 5 Zeichen lang sein kann und sie sowohl Ziffern als auch Buchstaben enthalten kann, ist eine Auftrennung nur mit großem Aufwandt zu erreichen. Von Erfassungsfehlern, die sich immer wieder und bei 25stelligen Bandwurmangaben immer häufiger einschleichen, ganz zu schweigen. Ein weiteres Beispiel wären Konstrukte wie 1..8.Adresszeile. Natürlich funktioniert das noch ganz gut wenn man sich in Deutschland bewegt. Enthält der Datenbestand dann z.B. nordamerikanische Adressen und lautet die Aufgabenstellung Briefe nach Stadt,Straße,hausnummer zu sortieren, natürlich unter Berücksichtigung des US-States, dann wird das schon etwas aufwendiger.
Was Dein Beispiel "M8" angeht, dahinter verbirgt sich ein ganzer Satz von technischen Details die "M8" beschreiben. Da sollte eine Sortierung nicht über den Namen, sondern über eben diese Details erfolgen. Ein ähnliches Beispiel läuft mir in der täglichen Arbeit über den Weg, wobei offizelle Aktennummern zwei (oder mehr) unterschiedliche Formate haben(über 50 bis 100 Jahre gesehen verständlich). Da kann man nichts machen, ausser in einem zweiten Feld, die EDV-taugliche Variante ablegen. Ein schönes Beispiel für die Vermengung von unterschiedlichen Informationen hat es bei der Bundesbahn gegeben. Da hatten (Dampf)Lokomotiven eine Baureihenbezeichnung und eine mehr oder weniger fortlaufende Nummerierung. in den meisten Fällen reichten hierfür 2 + 3 Stellen. Bei der Baureiche 50 gab es aber mehr als 999 Lokomotieven, also gab es halt 4 Stellen für die Zählung. Bei Einführung der EDV wurde dann alles in ein 6 stelliges Schema mit Prüfziffer übertragen, und plötzlich gab es auch eine Baureihe 51 die die Lokomotiven >999 der Baureihe 50 enthielt. Verzeihlich wenn man an die Damalige Speicherknappheit denkt. Heute ist ein solchen Verhalten nicht mehr notwendig.

Gruß
K-H

Walter Landwehr 18. Mai 2015 12:59

AW: String richtig sortieren
 
Habe dass Sortieren jetzt aufgegeben. In den Ziffern stecken zu viele Abnormitäten drin wie 10.1, 8256H1, A, 2a, usw.

Danke trotz alledem für Eure mühen.

himitsu 18. Mai 2015 13:13

AW: String richtig sortieren
 
Zitat:

Zitat von himitsu (Beitrag 1301759)
Ob/Wo sich soeine Funktion bei dir versteckt ... Bei Google suchenFirebird naturalsort

:stupid:

p80286 18. Mai 2015 13:15

AW: String richtig sortieren
 
kannst du denn die sortierung nicht über andere Felder realisieren?
was wis ich Rechnungsdatum Durchmesser oder was auch immer Dir zur Verfügung steht?

Gruß
K-H

Dejan Vu 18. Mai 2015 15:20

AW: String richtig sortieren
 
Ich wette mit Dir, das Dir hier einer der Codefreaks hilft, sobald Du ihm die Sortierregeln erklärst. Das schreit doch gerade nach "Es-juckt-mir-in-den-Fingern-gib-mir-was-zum-Coden"

himitsu 18. Mai 2015 17:40

AW: String richtig sortieren
 
Wieso? Wenn es doch schon was Fertiges für sowas und alles Mögliche gibt? :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz