PDA

View Full Version : DB2 und Concat von Strings?



Seiten : [1] 2

LordCinimod
15-06-16, 11:18
Moin :),

ich habe da mal eine Frage zu SQL.
Ich wollte gerade auf der System i in einer Tabelle zwei char Felder miteinander verbinden, dabei sollten die Felder durch ein Leerzeichen getrennt werden.

Beim MS-SQL Server mache ich das ja mit einem + Zeichen
Beispiel:
select vorname, nachname, vorname + " " + nachname as name from ..
unter My-SQL läuft das ja mit concat:

select vorname, nachname, concat(vorname, " ", nachname) as name from ..

Auf der System i geht das ja so anscheinend nicht, jedenfalls bekomme ich da dann einen Fehler geworfen. Ich habe es dann einmal so probiert:

select vorname, nachname, concat(concat(vorname, " "), nachname) as name from ..

aber optimal finde ich das nicht. Gibt es da noch eine andere Möglichkeit?

Grüße
Dominic

Fuerchau
15-06-16, 11:39
Für Standard-SQL lautet die Syntax:

Feld1 concat feld2 concat feld3 ..... concat feldn

Die Funktion Concat kennt nur 2 Argumente.
Dann wäre das so:
concat(Feld1, Feld2)
concat(Feld1, concat(feld2, feld3))

Ansonsten gibt es ja eigentlich das SQL-Referenz-Handbuch zum Download als PDF.
Das finde ich immer wieder sehr hilfreich.

LordCinimod
15-06-16, 11:57
Das concat nur 2 Argumente kennt habe ich ja schon festgestellt! Deswegen ja auch das concat(concat(.... Beispiel.

In der Referenz habe ich auch schon geschaut aber nichts zu gefunden, außer eben das Concat hier nur 2 Argumente akzeptiert.

So wirklich neues hast du nun nicht geschrieben, oder? ;)
Ich habe ja danach gefragt ob es einen anderen Weg gibt um das nicht so umständlich und verschachtelt schreiben zu müssen.

BenderD
15-06-16, 12:10
Das concat nur 2 Argumente kennt habe ich ja schon festgestellt! Deswegen ja auch das concat(concat(.... Beispiel.

In der Referenz habe ich auch schon geschaut aber nichts zu gefunden, außer eben das Concat hier nur 2 Argumente akzeptiert.

So wirklich neues hast du nun nicht geschrieben, oder? ;)
Ich habe ja danach gefragt ob es einen anderen Weg gibt um das nicht so umständlich und verschachtelt schreiben zu müssen.

... les doch mal die Antworten und die Referenz genau, da ist doch alles drin, auch ohne schachteln!
Concat ist auch Operator!!!
select 'a' concat 'b' concat 'c'
from sysibm.sysdummy1

oder auch

select 'a' || 'b' || 'c'

hiran ist allerdings blöd, dass das Pipe Zeichen je nach CCSID auch als

select 'a' !! 'b' !! 'c'

erscheint.

D*B

Fuerchau
15-06-16, 12:38
Ich kann mich Dieter nur anschließen:

"Feld1 concat feld2 concat feld3 ..... concat feldn"

war meine Antwort.

LordCinimod
15-06-16, 12:42
Du hast Recht, das habe ich falsch verstanden! Der Hinweis für stdsql war für mich keine Erläutertung das es so auch auf der DB2 klappt(manche Sachen gehen ja auf der DB2 nicht oder nur anders), daher habe ich das nur schnell überflogen. Mein Fehler, Entschuldigung!

Die Schreibweise mit den || habe ich auch in der Referenz gelesen, jedoch akzeptiert RDi das nicht bei mir sondern wirft einen Fehler das dies so nicht korrekt sei.

Fuerchau
15-06-16, 13:25
Wie Dieter schon schrieb, "||" ist von der CCSID zur Laufzeit abhängig und muss ggf. durch "!!" ersetzt werden. Wenn sich dann die Job-CCSID zur Laufzeit ändert funktioniert der SQL nicht mehr.

LordCinimod
15-06-16, 14:14
Problem hat sich inzwischen erledigt :)
Habe vorhin noch einmal ein Versuch unternommen, dieser ging dann auch. Keine Ahnung was vorher das Problem war.....eventuell hat das neustarten der VM geholfen, kp!

Danke für die Erklärungen !

holgerscherer
16-06-16, 08:29
manche Sachen gehen ja auf der DB2 nicht oder nur anders

Das ist immer eine Frage der relativen Betrachtungsweise. Auf der DB2 auf IBM i gehen die Sachen in der Regel richtig und elegant - andere Systeme strickeln auch rum. Da die aber weiter verbreitet sind, meint man, das wäre "normal" ;-)

-h

B.Hauser
17-06-16, 08:02
Das ist immer eine Frage der relativen Betrachtungsweise. Auf der DB2 auf IBM i gehen die Sachen in der Regel richtig und elegant - andere Systeme strickeln auch rum. Da die aber weiter verbreitet sind, meint man, das wäre "normal" ;-)

-h

DB2 for i Syntax entspricht i.d.R. der SQL-Standard-Vorgaben, während andere Datenbanken-Hersteller eine eigene Version entwickelt haben und nicht einsehen warum das Rad doppelt erfunden werden sollte.
Aber auch auf der DB2 for i gibt es z.B. einige Funktionen doppelt (z.B. UCASE() und UPPER()). In diesem Fall hat IBM zu der "eigenen" Funktion UCASE noch die Standard Version hinzugefügt.
Wie Holger sagt, eigentlich muss es umgekehrt heißen, in anderen Datenbanken funktioniert es anders.

Birgitta