winniepooh: MySQL: JOIN wenn Abfrage nicht erfolgreich

Guten Tag,

ich habe Schwierigkeiten, eine Idee per MySQL in die Tat umzusetzen und hoffe, hier Tipps zu erhalten.

Die Problemschilderung:

Es ist eine Tabelle vorhanden, welche folgende Felder enthält:
id INT auto_increment PRIMARY_KEY
key TEXT NOT NULL
en\_value TEXT NULL
de\_value TEXT NULL
fr\_value TEXT NULL
...
Es handelt sich dabei um eine Sprachtabelle, in welcher einem bestimmten Schlüssel der jeweilige Ausdruck in einer Sprache zugeordnet wird.
Beispiel:
Schlüssel (key): hello
englischer Wert (en\_value): hello
deutscher Wert (de\_value): Hallo
französischer Wert (fr\_value): Salut

Nun steht mir bei der Abfrage das Sprachkürzel zur Verfügung (d.h. englisch->en, deutsch->de, französisch->fr). Ich möchte anhand von diesem Kürzel den entsprechenden Wert auslesen.

Beispiel für deutsche Sprache:

SELECT de\_value FROM lang WHERE key = 'hello';

Klappt soweit natürlich.
Wenn jedoch kein Wert für den deutschen Ausdruck hinterlegt ist, so möchte ich den englischen auslesen.

SELECT de\_value, en\_value FROM lang WHERE key = 'hello';

Das liest mir jedoch immer sowohl den deutschen, als auch den englischen aus.
Ich möchte jedoch, dass versucht wird, den deutschen auszulesen, und erst wenn dies fehlschlägt, der englische ausgelesen wird.

Auf zwei Abfragen aufgeteilt würde das so aussehen:
SELECT de\_value AS value FROM lang WHERE key = 'hello' AND value IS NOT NULL;
(Überprüfung, ob Query erfolgreich. Wenn nein, zweites Query:)
SELECT en\_value AS value FROM lang WHERE key = 'hello'  AND value IS NOT NULL;

Wie kann ich diese zwei Abfragen in einer zusammenfassen?
Der LEFT-, RIGHT- und INNER-JOIN scheinen mir dafür ungeeignet.

Habt Ihr einen Tipp, wie ich das realisieren kann?

Vielen Dank für Eure Mühe!

  1.   
    SELECT if(`de_value` IS NOT NULL,`de_value`,`en_value`) AS value FROM `lang` WHERE `key` = 'hello';  
    
    

    das wäre z.b. eine möglichkeit

    1. Danke! Klappt soweit perfekt.

      Nun einmal angenommen, dass kein englischer Wert hinterlegt ist (en\_value = NULL). Das Query würde trotzdem einen Datensatz zurückgeben, bei dem value = NULL ist. Wie kann ich erreichen, dass eine leere Rückgabe erfolgt, soweit de\_value und en\_value = NULL sind?

      SELECT if(de\_value IS NOT NULL,de\_value,en\_value) AS value FROM lang WHERE key = 'hello' AND de\_value IS NOT NULL AND en\_value IS NOT NULL;

      Diese Abfrage wäre möglich, gibt es noch eine kürzere Möglichkeit?
      Falls mehr Felder verwendet werden wird es so nämlich ellenlang.

      Gruß,
      Philip

      1. Ohje, zu spät die Stunde scheint mir.

        Der Wert ist ja in value gespeichert ein einfaches
        WHERE value IS NOT NULL
        genügt also.

        Danke.

        1. Der Korrektheit wegen:
          Einen Alias, wie es value in diesem Fall ist, kann man nicht mit WHERE verknüpfen.
          Es muss die HAVING-Syntax verwendet werden:
          SELECT ... HAVING value IS NOT NULL

          1. Hallo,

            Der Korrektheit wegen:
            Einen Alias, wie es value in diesem Fall ist, kann man nicht mit WHERE verknüpfen.
            Es muss die HAVING-Syntax verwendet werden:
            SELECT ... HAVING value IS NOT NULL

            Der Korrektheit wegen. HAVING gehört zu GROUP BY.
            Die weitaus bessere Lösung findest Du in meinem Posting.

            Und ja, der Korrektheit wegen ORDER BY COALESCE(<argumentenliste>) ...

            Freundliche Grüße

            Vinzenz

  2. Hallo,

    Die Problemschilderung:

    Es ist eine Tabelle vorhanden, welche folgende Felder enthält:
    id INT auto_increment PRIMARY_KEY
    key TEXT NOT NULL
    en\_value TEXT NULL
    de\_value TEXT NULL
    fr\_value TEXT NULL

    Wenn jedoch kein Wert für den deutschen Ausdruck hinterlegt ist, so möchte ich den englischen auslesen.

    SELECT de\_value, en\_value FROM lang WHERE key = 'hello';

    Du suchst COALESCE():

      
    SELECT                                                -- Gib mir den ersten  
        COALESCE(de_value, en_value, fr_value, '') value  -- von NULL verschiedenen  
                                                          -- Eintrag der Parameterliste  
    FROM  
        lang  
    WHERE  
        `key` = 'hello'            -- key ist ein Spaltenname, den ich auf  
                                   -- *jeden* Fall vemeide  
    
    

    Nein, diese komplexen IF-Konstrukte sollte man lieber lassen.

    Freundliche Grüße

    Vinzenz