Anmelden

View Full Version : SQL Update Num mit Char



Seiten : [1] 2

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.

B.Hauser
22-10-04, 09:22
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

Fuerchau
22-10-04, 09:31
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.

BenderD
22-10-04, 09:31
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

B.Hauser
22-10-04, 10:50
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

Fuerchau
22-10-04, 11:40
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 ?

Fuerchau
28-10-04, 12:30
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.

B.Hauser
28-10-04, 14:53
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

schwenth
01-11-04, 17:34
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