JOIN ON Col1=Col1 auch bei NULL



  • Hi,

    ich füge zwei Tabellen anhand von zwei Spalten zusammen. Ich führe dabei einen FULL JOIN durch, mit der Bedingung, das beide Spalten der einen Tabelle mit der jeweils entsprechenden Spalte der zweiten übereinstimmen. Eine Spalte in beiden Tabellen kann dabei auch NULL enthalten, was in dem ON-Statement wohl als FALSE interpretiert wird. Hier ein Beispiel:

    Tabelle 1:   Tabelle 2:
    
     a | b        a | b
     --+------    --+------
     1 | NULL     1 | NULL
     2 | NULL     2 | NULL
     2 | 1        3 | NULL
     2 | 2        3 | 1
     3 | NULL     3 | 2
     4 | NULL     4 | NULL
    
    FULL JOIN ON(a=a AND b=b):
     a    | b    | a    | b
    ------+------+------+------
     1    | NULL | NULL | NULL
     2    | NULL | NULL | NULL
     2    | 1    | NULL | NULL
     2    | 2    | NULL | NULL
     3    | NULL | NULL | NULL
     4    | NULL | NULL | NULL
     NULL | NULL | 1    | NULL
     NULL | NULL | 2    | NULL
     NULL | NULL | 3    | NULL
     NULL | NULL | 3    | 1
     NULL | NULL | 3    | 2
     NULL | NULL | 4    | NULL
    
    Gewünscht:
     a    | b    | a    | b
    ------+------+------+------
     1    | NULL | 1    | NULL
     2    | NULL | 2    | NULL
     2    | 1    | NULL | NULL
     2    | 2    | NULL | NULL
     3    | NULL | 3    | NULL
     4    | NULL | 4    | NULL
     NULL | NULL | 3    | 1
     NULL | NULL | 3    | 2
    

    Muss ich dazu speziell auf NULL abfragen oder kann ich das auch einfacher erreichen?



  • Hallo,

    es wäre mir neu wenn NULL als FALSE interpretiert wird. Höchstens als 0 (was logisch FALSE wäre) oder eben NULL. Und das ganze lässt sich mit IS NULL | IS NOT NULL recht einfach abfragen.

    In deinem Fall hast du hoffentlich den Tabellenpräfix drangehangen

    FULL JOIN ON (tab1.a=tab2.a AND tab1.b=tab2.b)
    

    Andernfalls ist a immer a und b ist auch immer b...

    Aber sonst hab ich keinen Plan was genau du da tust. Deine Erklärung passt nicht zum Wunschergebnis.

    VlG



  • Ich hab inzwischen in der Doku gefunden, dass Vergleiche von zwei Spalten, die beide NULL sind, FALSE leifern. Aber wie man das alagant umgehen kann, stand da nicht.



  • Heimelchen schrieb:

    Ich hab inzwischen in der Doku gefunden, dass Vergleiche von zwei Spalten, die beide NULL sind, FALSE leifern. Aber wie man das alagant umgehen kann, stand da nicht.

    Na mit (a = b OR (a IS NULL AND b IS NULL))



  • Soweit hab ich das auch noch hingekriegt. Ist bei zwei Spalten auch nicht so das Thema, bei 20 artet das ganz schön in Schreibarbeit aus...



  • Dann definier dir eine User-Defined-Function.



  • MySQL kennt den "<=>" Operator:
    http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_equal-to

    Zitat:
    mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
    -> 1, 1, 0
    mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
    -> 1, NULL, NULL

    Gruß,
    MJM


Anmelden zum Antworten