2016-06-02 18 views
0

Ich habe Tabelle A, die mit Tabelle B "VERWENDUNG" Spalte_1 verbunden ist. Ich mag, dass die Abfrage alle Zeilen in der Tabelle A zeigen, wo der Wert in column_2 nicht in Tabelle BHandhabung von NULL bei Verwendung des NOT EQUAL-Operators

So alle Werte in column_2, column_3 oder column_4 der verbundenen Reihe ist gleich, ich versuchte, mit:

Nun, wenn jede Zelle in B.column_2, B.column_3 und B.column_4 einen Wert enthält, funktioniert die Abfrageprüfung und es werden alle Zeilen in Tabelle A aufgelistet, wo der Wert in A.column_2 nein hat Übereinstimmung in Tabelle B.

Das Problem tritt auf, wenn einige der Zellen in Tabelle B einen NULL-Wert haben. Dann werden keine Ergebnisse zurückgegeben. Dies scheint zu sein, weil MySQL die folgende Auffassung FALSCH sein:

23 <> NULL 

... Und da die Abfrage für Fälle ist, wo alle Prüfungen TRUE zurück, es gibt nichts zurück.

Das Folgende ist eine Behelfslösung, dass ich, indem die Tabelle B-Säulen eingesetzt umschlungen mit einem IFNULL, wo der IFNULL Wert 0 ist im Wesentlichen diese konvertiert alle jene NULL Zellen auf 0 ... und damit die UNGLEICH Check gibt TRUE korrekt zurück, wenn keine Übereinstimmungen vorhanden sind und diese Zeilen in Tabelle A angezeigt werden. Der Code ist wie folgt:

WHERE 
A.column_2 <> IFNULL(B.column_2, 0) AND 
A.column_2 <> IFNULL(B.column_3, 0) AND 
A.column_2 <> IFNULL(B.column_4, 0) 

Dies scheint eine runde Sache zu sein, damit umzugehen. Gibt es einen besseren Weg, damit umzugehen?

+0

Sie coalesce Funktion –

+0

@Jordan IFNULL verwenden können() ist so ziemlich das gleiche wie coalesce(), um nur begrenzt auf 1 Wert. – Shadow

Antwort

0

Sie können auch die < => Operator verwenden.

siehe

MariaDB [(none)]> SELECT 1 <> 1 , 1 <> 0 , 0 <> 0, 0 <> NULL , NULL <> 0 , 0 <=> NULL, NULL <=> 0, NULL <=> NULL; 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
| 1 <> 1 | 1 <> 0 | 0 <> 0 | 0 <> NULL | NULL <> 0 | 0 <=> NULL | NULL <=> 0 | NULL <=> NULL | 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
|  0 |  1 |  0 |  NULL |  NULL |   0 |   0 |    1 | 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
1 row in set (0.00 sec) 

MariaDB [(none)]> 
+0

<=> ist ein Null-Safe-Equasion-Operator. Sie müssten ziemlich komplizierte Kriterien mit diesem Operator erstellen, um die gleiche Ausgabe wie in der Frage zu erreichen. – Shadow

0

ich stattdessen den not in Operator verwenden würde:

... WHERE A.column_2 NOT IN (B.column_2,B.column_3,B.column_4) 
+0

DAS IST ES! Ich benutze IN und NOT IN für andere Dinge. Normalerweise liegt es jedoch in einer Reihe von statischen Werten. Ich vergesse, dass eine Zelle auf die gleiche Weise referenziert werden kann. Das Schöne ist, dass IN funktioniert, um das Gegenteil zu überprüfen, d. H., Zeige mir alle Zeilen, die übereinstimmen. Kudos! – PhoenixTech

+0

Dann markieren Sie bitte die Antwort als akzeptiert, um anderen Zuschauern dieses Themas zu zeigen, dass die Frage jetzt gelöst ist! – Shadow

+0

tat ich. Allerdings werde ich das erst zeigen, wenn ich 15 Reputationspunkte verdiene. (Ich bin noch neu hier ....) – PhoenixTech