AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi String richtig sortieren
Thema durchsuchen
Ansicht
Themen-Optionen

String richtig sortieren

Ein Thema von Walter Landwehr · begonnen am 16. Mai 2015 · letzter Beitrag vom 18. Mai 2015
Antwort Antwort
Seite 1 von 2  1 2      
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#1

String richtig sortieren

  Alt 16. Mai 2015, 18:07
Datenbank: Firebird • Version: 2.5.4 • Zugriff über: IBO
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.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: String richtig sortieren

  Alt 16. Mai 2015, 18:22
Machs doch genauso

SQL-Code:
select
   <Feldliste>
from
  <Tabelle>
order by
  cast( <Spalte> as BigInt);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: String richtig sortieren

  Alt 16. Mai 2015, 18:24
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Mai 2015 um 21:09 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: String richtig sortieren

  Alt 16. Mai 2015, 20:47
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
Miniaturansicht angehängter Grafiken
wertnummer.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: String richtig sortieren

  Alt 17. Mai 2015, 04:53
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

"Wort zum Sonntag"

  Alt 17. Mai 2015, 06:41
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 ...

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.

Geändert von Perlsau (17. Mai 2015 um 08:07 Uhr) Grund: Tippfehler korrigiert
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: String richtig sortieren

  Alt 17. Mai 2015, 07:34
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.

Geändert von Dejan Vu (17. Mai 2015 um 07:37 Uhr)
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: String richtig sortieren

  Alt 17. Mai 2015, 08:27
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.
Walter Landwehr
Mfg

Walter

Geändert von Walter Landwehr (17. Mai 2015 um 08:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: String richtig sortieren

  Alt 17. Mai 2015, 09:10
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#10

AW: String richtig sortieren

  Alt 17. Mai 2015, 09:21
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz