Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.361 Beiträge
Delphi 11 Alexandria
|
AW: Chr Feld numerisch sortieren
13. Aug 2015, 12:54
Dann muss der Rest hinten ran:
[EDIT]SP - Code noch mal geändert[/EDIT]
Code:
SET TERM ^ ;
create or alter procedure sp_sortstring (
wert varchar(20))
returns (
result varchar(30))
as
declare variable laenge smallint;
declare variable pos smallint;
declare variable zeichen char(1);
declare variable temp varchar(20);
declare variable s1 varchar(10);
declare variable rest varchar(10);
begin
result = null;
laenge = char_length(:wert);
if (:laenge > 0) then
begin
pos = 1;
while (:pos <= :laenge) do
begin
zeichen = substring(:wert from :pos for 1);
if (:zeichen in ('0','1','2','3','4','5','6','7','8','9', '.')) then
temp = coalesce(:temp, '')||:zeichen;
else
begin
-- Rest hinten
rest = substring(:wert from :pos for 10);
break;
end
pos = :pos + 1;
end
end
if (coalesce(:temp, '') <> '') then
begin
-- Zahl vor Punkt auffüllen
pos = position('.', :temp);
if (:pos = 0) then
result = lpad(:temp, 10, '0');
else
result = lpad(substring(:temp from 1 for :pos -1), 10, '0')||'.'||
lpad(substring(:temp from :pos + 1 for :laenge), 10, '0');
result = :result||coalesce(:rest, '');
end
suspend;
end^
SET TERM ; ^
Wenn dann allerdings weitere zahlen kommen, dann sollte man wirklich über Alternativen nachdenken.
Die Länge der Varchars musst du noch prüfen. Ich weiß ja nicht, wie lang die Werte bei dir werden können.
Ach ja, wenn 2a vor 2.10a kommt (siehe Anhang), dann musst du wie folgt ändern:
Code:
...
if (coalesce(:temp, '') <> '') then
begin
-- Zahl vor Punkt auffüllen
pos = position('.', :temp);
if (:pos = 0) then
result = lpad(:temp, 10, '0')||'.'||lpad('0', 10, '0');
else
result = lpad(substring(:temp from 1 for :pos -1), 10, '0')||'.'||
lpad(substring(:temp from :pos + 1 for :laenge), 10, '0');
result = :result||coalesce(:rest, '');
end
Frank
Frank Reim
Geändert von dataspider (13. Aug 2015 um 13:12 Uhr)
|