Autor Beitrag
WEBSTER
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 60


D7Ent, FB, FIBPlus
BeitragVerfasst: Do 15.09.05 20:16 
ausblenden SQL-Anweisung
1:
2:
select Vorname || ', ' || Nachname
from tabelle

alex

Moderiert von user profile iconraziel: Code- durch SQL-Tags ersetzt
WEBSTER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: Do 15.09.05 21:29 
Salute,

danke. So habe ich es auch schon gelöst.

ausblenden 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 user profile iconraziel: Code- durch SQL-Tags ersetzt

_________________
Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
WEBSTER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: 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.

ausblenden 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 user profile iconChristian S.: Code- durch SQL-Tags ersetzt

_________________
Wer etwas anders macht, aber nicht besser, der sollte besser etwas anderes machen.
delphiDeveloper
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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:

ausblenden volle Höhe SQL-Anweisung
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(40CHARACTER SET ISO8859_1;
DECLARE VARIABLE V_KU_NAME2 VARCHAR(40CHARACTER SET ISO8859_1;
DECLARE VARIABLE V_KU_NAME3 VARCHAR(40CHARACTER SET ISO8859_1;
DECLARE VARIABLE CR_LF CHAR(2CHARACTER 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)) > 0THEN
     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)) > 0THEN
     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)) > 0THEN
     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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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. :mrgreen: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 94



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 02.11.05 14:04 
user profile iconnoidic 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. :mrgreen: Was ist hier der Unterschied :

NAME CHAR (30)

und

NAME CHAR (30) DEFAULT ' '

:?:

Firebird ist schon schlimm. :lol:

_________________
Gruß
Hansa
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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.

ausblenden SQL-Anweisung
1:
select coalesce(k.ku_name1,'') || coalesce(k.ku_name2,'') || coalesce(k.ku_name3,''from kunden k					


mfg
DD
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 02.11.05 14:49 
Stimmt, Coalesce gibts ja auch noch. 8) Und Webster : folgendes Beispiel ist in dem erwähnten "Firebird Null Guide" zu sehen : es geht um Vorname, Nachname und NULL. :mrgreen:

_________________
Gruß
Hansa
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 02.11.05 19:33 
user profile iconnoidic 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.