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