SQL-Abfrage mit addierten Feldern



  • Hallo alle zusammen,

    ich hänge hier an einem kleinen Problem.
    In meiner Anwendung welche ich gerade schreiben habe ich folgende SQL-Abfrage:

    SELECT *, Prename + \" \" + Surname AS Name FROM Employees
    

    Das funktioniert soweit auch prima. Die beiden Felder 'Prename' und 'Surname'
    werden mit einem Leerzeichen dazwischen als neues Feld 'Name' ausgegeben und können damit auch angezeigt werden.
    Jetzt hab ich aber beim herumspielen festgestellt, das wenn ich nur eines der beiden Felder 'Prename' bzw. 'Surname' mit einer Eingabe fülle und das andere leer lasse, bleibt das 'errechnete' Feld 'Name' auch leer. Also es wird nichts ausgegeben.
    Gibt es da noch eine Zusatzfunktion in der SQL-Abfrage oder irgendwie noch einen andere Lösung?

    Wäre nett wenn mir da jemand weiterhelfen könnte.

    Grüße Netzschleicher



  • Hi,

    ohne es getestet zu haben würde ich tippen, dass dann einer der beiden Werte NULL ist, statt einem Leerstring. Du könntest folgendes probieren:

    SELECT *, COALESCE(Prename,'') + \" \" + COALESCE(Surname,'') AS Name FROM Employees
    

    Dabei gibt COALESCE(arg1, arg2, ...) das erste nicht null Argument zurück.

    KaPtainCugel



  • Habs gleich heut Nacht noch ausprobiert. Teilweise mit Erfolg.
    Ich hatte vergessen zu schreiben, das die Anwendung mit 3 verschiedenen Datenbank(Servern) zusammenarbeiten soll.

    Wenn die Datenbank auf einem MS-SQL2008 Server liegt funktioniert das mit der 'COALESCE'-Funktion einwandfrei.
    Der MySQL-Server gibt nur 0 zurück. Und die lokale MS-Access200 Datenbank meldet
    einen unbekannten Fehler.
    Gibt es dafür eine 'allgemeine' Formulierung die auf allen 3 Servern läuft, oder
    bleibt mir da nichts anderes übrig als dann für jeden Server den passenden SQL-String zu generieren?

    Eine allgemeine Lösung wäre schon das bequemste. 😉 😃

    Auf jeden Fall vielen Dank schonmal für den ersten Tipp.



  • Im Allgemeinen nicht, da solche Funktionen überall anders heißen können. Da mußt du schon wissen, auf welcher Datenbank du gerade arbeitest und dann die richtige Funktion übergeben.



  • Guten Morgen,

    ich hab selbst nochmal gegoogelt und hab dann für den MS-SQL und die lokale Access-Datenbank folgende SQL Abfragen generiert die einwandfrei laufen:

    für den MS-SQL2008:

    SELECT * , LTRIM(COALESCE(Prename, '') + ' ' + COALESCE(Surname, '')) AS Name FROM Employees
    

    für die lokale Access-Datenbank:

    SELECT * , LTRIM(IIF(IsNull(Prename),'',Prename) + ' ' + IIF(IsNull(Surname),'',Surname)) AS Name FROM Employees
    

    nur der MySQL weigert sich beharrlich. Laut Dokumentation sollte dieser mit der 'COALESCE'-Funktion
    auch umgehen können. Doch leider kommt als Ergebnis in dem 'berechneten' Name-Feld immer nur die Ziffer '0'
    dabei heraus. Wenn ich den String so wie beim MS-SQL mit eingebautem 'LTRIM' verwende kommt als Ergebnis
    der String '(VARBYTES)' dabei heraus. 😕
    Ich werde mal den Tag über es noch mit einem Konstrukt ähnlich der lokalen Access-Datenbank versuchen.
    Falls noch jemand eine Idee oder Tipp hat, bitte melden.

    Grüße Netzschleicher



  • Hallo,

    schau mal hier

    LG



  • Danke für den Tipp, leider ohne Erfolg.

    Der MySQL scheint einen logischen Vergleich zu machen. Egal wie ich es bis jetzt
    versucht habe, also mit z.B.

    SELECT * , (CASE(Prename) WHEN Prename THEN Prename ELSE '' END + ' ' + CASE(Surname) WHEN Surname THEN Surname ELSE '' END) AS Name FROM Employees
    

    oder

    SELECT * , IF(ISNULL(Prename),'',Prename) + ' ' + IF(ISNULL(Surname),'',Surname) AS Name FROM Employees
    

    er gibt immer '0' zurück. Einzig was ich schon erreicht habe ist, das nur '0' zurückgeliefert wird
    wenn beide Felder, also 'Prename' und 'Surname' gefüllt sind. Ansonsten dann ein Leerstring. 😕 😕 😕



  • Jepp, hab mir nochmals die Dokumentation zum MySQL genauer durchgelesen und auch über Google noch einen kleinen Tipp bekommen.
    Mit folgendem SQL-String funktioniert das ganze jetzt auch mit dem MySQL-Server:

    SELECT * , LTRIM(CONCAT(IF(ISNULL(Prename),'',Prename), ' ', IF(ISNULL(Surname),'',Surname))) AS Name FROM Employees
    

    Hab mir dann dazu noch eine kleine Funktion geschrieben welche den zur Laufzeit aktuell verbundenen Server
    zurückgibt, und kann dann damit über 'switch / case' im Programm für den jeweiligen Server den
    richtigen SQL-String erzeugen.

    Vielen Dank für die kleinen Tipps, in Summe haben die mich auf die Lösung gebracht. 🙂 🙂 🙂
    👍


Anmelden zum Antworten