View Full Version : SQL Update Num mit Char
spiceisnice
22-10-04, 07:48
Hallo Leute,
ich quäle mich für gewisse Anforderungen von RPG auf SQL umzusteigen.
UPDATE LIB/FILE SET FeldN= substr(FeldA, 4, 13)
FeldN ist numerisch 13
FeldA ist alpha
Wie kann man in SQL Felder konvertieren ?
Danke.Mfg.
Hallo Leute,
ich quäle mich für gewisse Anforderungen von RPG auf SQL umzusteigen.
UPDATE LIB/FILE SET FeldN= substr(FeldA, 4, 13)
FeldN ist numerisch 13
FeldA ist alpha
Wie kann man in SQL Felder konvertieren ?
Danke.Mfg.
Hallo,
alphanumerische Strings können über CAST in numerische Felder umbegesetzt werden:
Update MyLib/MyFile
Set FeldN = Cast(Substr(FeldA, 4, 13) as Dec(13, 0))
Birgitta
Es geht auch: dec(substr(FeldA, 4, 13), 13, 0)
Wichtig ist nur, dass rein numerische Daten im Feld stehen dürfen, sonst bricht der SQL ab.
Hallo,
zusätzlich geht (meist) auch das Robert Lemke Prinzip: "welches Schweinderl hätten Sie denn gerne?". Es gibt Cast Funktionen, die so heißen wie der Typ in den man umwandeln will. Am besten mal in die SQL Reference bei den Funktionen reinschauen!
mfg
Dieter Bender
Hallo,
alphanumerische Strings können über CAST in numerische Felder umbegesetzt werden:
Update MyLib/MyFile
Set FeldN = Cast(Substr(FeldA, 4, 13) as Dec(13, 0))
Birgitta
Hallo,
Es gibt Cast Funktionen, die so heißen wie der Typ in den man umwandeln will. Am besten mal in die SQL Reference bei den Funktionen reinschauen!
Nur noch eine Bemerkung dazu ob man CAST oder die entsprechende Funktion verwenden sollte:
Bei allen diesen Funktionen ist in der SQL-Referenz eine Note zu finden, die besagt, dass CAST der entsprechenden Funktion vorzuziehen sei, um maximale Portabilität zu erreichen.
NOTE:
Syntax alternatives:When the first argument is numeric, or the first argument is a string and the length argument is specified, the CAST specification should be used for maximal portability.
Birgitta
Naja, wenn ich meine Anwendung auch mal auf Oracle o.ä. laufen lassen will, darf ich wohl Feldtypen wie "decimal" nicht unbedingt verwenden.
Solange ich auf AS/400 (i5) bleibe, hoffe ich doch sehr stark, dass IBM die Kompatibilität nicht aus den Augen verliert.
spiceisnice
28-10-04, 12:24
Mit CAST oder DEC hats funktioniert. Wie geht man vor wenn der Text Blanks enthält wie zb. GLN 12 12345 12345 1. Numerisches Feld soll dann nur 1212345123451 enthalten ?
Tja, mit SQL schlechte Karten, da es keine Strip-Funktion gibt.
Wenn das Format immer konstant ist, kannst du per
dec(substr(feld, 5, 2) concat substr(feld, 8, 5) concat .....)
den Wert bekommen.
Ansonsten hilft dann wohl nur eine UDF (Userdefinied Function). Wie diese erstellt werden, siehe in der SQL-Referenz nach.
Hallo,
leider gibt es in SQL erst ab Release V5R3M0 eine Funktion REPLACE, die es ermöglicht Zeichen aus einem String zu entfernen.
D MyText S 50A inz('ABC XYZ 1234 567890 A')
*----------------------------------------------------------
C/EXEC SQL
C+ Set :MyText = Replace(:MyText, ' ', '')
C/End-Exec
C MyText Dsply
C Eval *INLR = *On
Wenn Du diese Funktionalität vor Release V5R3M0 unbedingt in SQL braucht, hast Du nur die Möglichkeit Dir eine User Defined Function (UDF) zu stricken.
Dabei kann es sich entweder um eine Funktion z.B. in RPG geschrieben, die als UDF registriert wird, oder die direkt in SQL geschrieben ist.
Die folgende Funktion müsste funktionnieren:
Create Function MyLib/RmvCharacter
(InString VarChar(100),RepChar VarChar(1))
returns varchar(100)
Language SQL
BEGIN
Declare OutStr varchar(100);
Declare StrPos integer;
Set OutStr = InString;
Set StrPos = -1;
While StrPos <> 0 Do
Set StrPos = locate(RepChar, OutStr, 1);
If StrPos > 1
and StrPos < Length(OutStr) - 1
Then Set OutStr = substr(OutStr, 1, StrPos - 1) concat
substr(OutStr, StrPos + 1,
Length(OutStr) - StrPos);
ElseIf StrPos = Length(Outstr)
Then Set OutStr = substr(OutStr, 1, StrPos - 1);
ElseIf StrPos = 1
Then Set OutStr = substr(OutStr, 2, Length(Outstr) - 1);
End If;
End While;
Return OutStr;
END
Birgitta
Hallo,
leider gibt es in SQL erst ab Release V5R3M0 eine Funktion REPLACE, die es ermöglicht Zeichen aus einem String zu entfernen.
D MyText S 50A inz('ABC XYZ 1234 567890 A')
*----------------------------------------------------------
C/EXEC SQL
C+ Set :MyText = Replace(:MyText, ' ', '')
C/End-Exec
C MyText Dsply
C Eval *INLR = *On
Wenn Du diese Funktionalität vor Release V5R3M0 unbedingt in SQL braucht, hast Du nur die Möglichkeit Dir eine User Defined Function (UDF) zu stricken.
Dabei kann es sich entweder um eine Funktion z.B. in RPG geschrieben, die als UDF registriert wird, oder die direkt in SQL geschrieben ist.
Die folgende Funktion müsste funktionnieren:
Create Function MyLib/RmvCharacter
(InString VarChar(100),RepChar VarChar(1))
returns varchar(100)
Language SQL
BEGIN
Declare OutStr varchar(100);
Declare StrPos integer;
Set OutStr = InString;
Set StrPos = -1;
While StrPos <> 0 Do
Set StrPos = locate(RepChar, OutStr, 1);
If StrPos > 1
and StrPos < Length(OutStr) - 1
Then Set OutStr = substr(OutStr, 1, StrPos - 1) concat
substr(OutStr, StrPos + 1,
Length(OutStr) - StrPos);
ElseIf StrPos = Length(Outstr)
Then Set OutStr = substr(OutStr, 1, StrPos - 1);
ElseIf StrPos = 1
Then Set OutStr = substr(OutStr, 2, Length(Outstr) - 1);
End If;
End While;
Return OutStr;
END
Birgitta
Hallo Zusammen,
bis hierher ist mir ja noch alles verständlich. Aber ein PHP-Script auf der AS400 ?? Geht das?
Gruss,
Thilo