Autor |
Beitrag |
WEBSTER
      
Beiträge: 94
|
Verfasst: Do 15.09.05 18:26
Salute,
ich nutze Firebird 1.5 und möchte den SQL Befehl concat benutzen. Leider gibt es diesen Befehl nicht unter Firebird.
Welche Alternative habe ich zu diesem Befehl?
Bitte um Hilfe.
THX
WEBSTER
_________________ Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
|
|
alex517
      
Beiträge: 60
D7Ent, FB, FIBPlus
|
Verfasst: Do 15.09.05 20:16
|
|
WEBSTER 
      
Beiträge: 94
|
Verfasst: Do 15.09.05 21:29
Salute,
danke. So habe ich es auch schon gelöst.
SQL-Anweisung 1: 2: 3:
| select k.*, (s.anrede||' '||s.vorname||' '||s.nachname) AS sachbearbeiter_name from Kunden k, sachbearbeiter s where s.sachbearbeiter_nr=k.sachbearbeiter_nr |
THX
WEBSTER
Moderiert von raziel: Code- durch SQL-Tags ersetzt
_________________ Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
|
|
WEBSTER 
      
Beiträge: 94
|
Verfasst: Mi 02.11.05 10:40
Salute,
anscheinend habe ich es doch noch nicht gelöst.
Wenn bei folgenender Abfrage das Feld Firma leer ist, dann ist "Vermittler_1" = null. Eigendlich wollte ich dann nur
Anrede Vorname und Nachname haben.
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8:
| SELECT distinct g.geschaefts_nr,g.KUNDEN_NR, g.VERMITTLER_NR_1, g.erfassungdat, (k.anrede||' '|| k.vorname||' '||k.nachname) as Kunde, (v.firma||' '|| v.anrede||' '|| v.vorname||' '||v.name) as Vermittler_1, FROM kunden k INNER JOIN geschaefte g ON (k.kunden_nr = g.kunden_nr) INNER JOIN vermittler v ON (v.vermittler_nr = g.vermittler_nr_1) where Status = 'Erfasst' |
Bitte um Hilfe.
THX
WEBSTER
Moderiert von Christian S.: Code- durch SQL-Tags ersetzt
_________________ Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
|
|
delphiDeveloper
      
Beiträge: 48
|
Verfasst: Mi 02.11.05 11:40
Titel: Firebird und Konkatenation von NULL Strings
Ist wie bei Multiplikation mit 0.
Ist ein Faktor=0 ist auch das produkt 0.
Du kannst dir aber eine SP bauen und dort deinen String zusammenbauen.
Etwa so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| CREATE PROCEDURE GETKUNDENNAME123 ( KU_ID_INPUT INTEGER) RETURNS ( ADR_NAME1_NAME2_NAME3 VARCHAR(512), ADR_NAME1_NAME2_NAME3_OCRLF VARCHAR(512)) AS DECLARE VARIABLE V_KU_NAME1 VARCHAR(40) CHARACTER SET ISO8859_1; DECLARE VARIABLE V_KU_NAME2 VARCHAR(40) CHARACTER SET ISO8859_1; DECLARE VARIABLE V_KU_NAME3 VARCHAR(40) CHARACTER SET ISO8859_1; DECLARE VARIABLE CR_LF CHAR(2) CHARACTER SET ISO8859_1; BEGIN
CR_LF = ASCII_CHAR(13) || ASCII_CHAR(10); ADR_NAME1_NAME2_NAME3 = ''; ADR_NAME1_NAME2_NAME3_OCRLF = ''; FOR SELECT K.KU_NAME1, K.KU_NAME2, K.KU_NAME3 FROM KUNDEN K WHERE (KUNDEN.KU_ID = :KU_ID_INPUT)
INTO :V_KU_NAME1, :V_KU_NAME2, :V_KU_NAME3 DO BEGIN IF (STRLEN(LTRIM(V_KU_NAME1)) > 0) THEN BEGIN ADR_NAME1_NAME2_NAME3 = V_KU_NAME1 || CR_LF; ADR_NAME1_NAME2_NAME3_OCRLF = V_KU_NAME1 || ' '; END
IF (STRLEN(LTRIM(V_KU_NAME2)) > 0) THEN BEGIN ADR_NAME1_NAME2_NAME3 = ADR_NAME1_NAME2_NAME3 || V_KU_NAME2 || CR_LF; ADR_NAME1_NAME2_NAME3_OCRLF = ADR_NAME1_NAME2_NAME3_OCRLF || V_KU_NAME2 || ' '; END
IF (STRLEN(LTRIM(V_KU_NAME3)) > 0) THEN BEGIN ADR_NAME1_NAME2_NAME3 = ADR_NAME1_NAME2_NAME3 || V_KU_NAME3 || CR_LF; ADR_NAME1_NAME2_NAME3_OCRLF = ADR_NAME1_NAME2_NAME3_OCRLF || V_KU_NAME3; END
SUSPEND; END END |
In deinem Select könntest du die Prozedur da so aufrufen:
SQL-Anweisung 1: 2: 3: 4:
| SELECT K.*, (SELECT ADR_NAME1_NAME2_NAME3_OCRLF FROM GETKUNDENNAME123(K.KU_ID)) AS KUNDENNAME FROM KUNDEN K |
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Mi 02.11.05 11:54
Normalerweise sollte das Ergebnis nicht null sein, nur weil ein Teilstring null ist. Allenfalls hast du ein Leerzeichen zuviel am Anfang. Oder ist das bei Firebird so schräg?
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.11.05 12:02
NULL = undefiniert und das ist <> 0 ! Also NULL <> 0. Schräg wäre es eher, wenn z.B. bei undefiniert + 5 irgendwas errechnet würde mit einer richtigen Zahl als Ergebnis.
_________________ Gruß
Hansa
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Mi 02.11.05 12:13
Bei einer Berechnung gebe ich dir da Recht ( Wobei bei Addition und Substraktion null afaik auch als 0 interpretiert wird ), aber es ist ja eine Verkettung. Und Wenn ich nichts mit etwas anderem Verkette kommt da das andere raus.
Bei Oracle z.B. führt das Statement
SQL-Anweisung 1:
| select ( null || '-' || 'test' ) from dual |
zum Ergebnis '-test', was ich auch genau so bei jeder Datenbank erwarten würde.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.11.05 12:28
Ich merke, daß Dir die Wahrheit nicht paßt.  Du wirst aber nicht dran vorbei kommmen. Firebird wird sich kaum zwingen lassen, einem undefinierten Wert automatisch einen definierten zu geben. Gesteuert macht man das mit Abfragen auf IS (not) NULL oder direkt mit DEFAULT beim Erzeugen der Tabellen. Wünsche oder bloße Vermutungen reichen leider nicht.  Wie man mit den NULL-Werten umgeht steht übrigens ausführlicher im "Firebird Null Guide" (bei SourceForge unter Firebird zu finden). Würde ich mal lesen.
_________________ Gruß
Hansa
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Mi 02.11.05 12:39
Da ich nicht mit Firebird arbeite, werde ich mir diesen Guide nicht durchlesen. Ich kann nur von meinen eigenen Erfahrungen berichten und die besagen bei allen Datenbanken, mit denen ich bisher gearbeitet habe, dass eine Verkettung mit Null die restlichen Teile der Kette nicht beeinflusst.
Wenn das bei Firebird anders ist, ok, gut. Ein Grund mehr, nicht damit zu arbeiten 
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Mi 02.11.05 12:58
Wenn Firebird die Funktion NVL kennt (ich benutze hier auch Oracle) kannst du die benutzen, um den null-Wert in einen Leerstring zu verwandeln:
SQL-Anweisung 1:
| (NVL(v.firma, '') ||' '|| NVL(v.anrede, '') ||' '|| NVL(v.vorname, '') ||' '|| NVL(v.name, '') as Vermittler_1 |
NVL erwartet zwei Argumente. Ist Argument 1 null, gibt es Argument 2 zurück, ansonsten Argument 1.
Oracle macht keinen Unterschied zwischen einem Leerstring und null. Das entspricht nicht dem ANSI-SQL Standard - Firebird verhält sich hier standardkonform, Oracle nicht.
Stefan
|
|
WEBSTER 
      
Beiträge: 94
|
Verfasst: Mi 02.11.05 13:03
Salute,
Firebird unterstützt die Funktion NVL leider nicht.
WEBSTER
_________________ Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.11.05 14:04
noidic hat folgendes geschrieben: | ...Wenn das bei Firebird anders ist, ok, gut. Ein Grund mehr, nicht damit zu arbeiten  |
Da sag ich nur : schön dumm.  Was ist hier der Unterschied :
NAME CHAR (30)
und
NAME CHAR (30) DEFAULT ' '
Firebird ist schon schlimm. 
_________________ Gruß
Hansa
|
|
Lemmy
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Mi 02.11.05 14:07
hi,
wobei es kein Problem ist eine solche Funktion zu erstellen (in Delphi) und in FB zu verwenden, evtl. gibt es auch schon eine, die man nur einbinden muss...
Grüße
Lemmy
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Mi 02.11.05 14:11
Damit würde ja nur dafür gesorgt, dass beim insert ohne explizite Angabe eines Wertes für die Spalte da '' statt null reingeschrieben wird, wenn die Spalte auf null geändert wird, ändert das nix an dem Problem.
Eventuell kommt man da mit einem Case..When - Konstrukt weiter, wenn Firebird sowas kann. Würd ich abe rnur empfehlen, wenns nur um die eine Spalte geht, sonst wirds zu unübersichtlich, da ist die Methode mit der SP eleganter.
Könnte mir aber auch vorstellen, dass Firebird was ähnliches wie NVL, aber unter anderem Namen hat.
Warum ich Firebird nicht benutze? Weil ich mit Oracle arbeiten kann.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
delphiDeveloper
      
Beiträge: 48
|
Verfasst: Mi 02.11.05 14:39
Titel: NVL nur bei Oracle aber coalesce geht bei Firedbird & Oracle
Wenn du keine SP benutzen willst, kannst du auch ab Firebird 1.5 "coalesce" verwenden!
Bei Oracle ist die Syntax so dass der erste Value zurueckgegeben wird, der <> NULL ist. Ich glaube das ist bei Firebird auch so!
Die Parameter mueesen also nicht zweistellig sein, sondern man kannn auch so was schreiben. coalesce(value1, value2, ..., ValueN,'leer) hierbei würde der Value zurückgegeben der als erster <> NULL ist.
Aber für dein Problem reicht das zweistellige ja aus.
SQL-Anweisung 1:
| select coalesce(k.ku_name1,'') || coalesce(k.ku_name2,'') || coalesce(k.ku_name3,'') from kunden k |
mfg
DD
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 02.11.05 14:49
Stimmt, Coalesce gibts ja auch noch.  Und Webster : folgendes Beispiel ist in dem erwähnten "Firebird Null Guide" zu sehen : es geht um Vorname, Nachname und NULL. 
_________________ Gruß
Hansa
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 02.11.05 19:33
noidic hat folgendes geschrieben: | Da ich nicht mit Firebird arbeite, werde ich mir diesen Guide nicht durchlesen. Ich kann nur von meinen eigenen Erfahrungen berichten und die besagen bei allen Datenbanken, mit denen ich bisher gearbeitet habe, dass eine Verkettung mit Null die restlichen Teile der Kette nicht beeinflusst.
Wenn das bei Firebird anders ist, ok, gut. Ein Grund mehr, nicht damit zu arbeiten  |
Dann hast Du noch nicht mit IBMs DB2 gearbeitet, dort ist das genauso. Ich habe Ewigkeiten gebraucht das herauszufinden, weil wir in einem SQL-Skript einen seltsamen Fehler hatten.
Soweit ich weiß, macht nur Oracle das mal wieder anders. Ansonsten steht das IMHO auch genauso in der SQL92-Spec.
|
|