Angenommen, ich habe Tabellen a (mit Spalte a1) und b (mit Spalten b1 und b2) und führe einen Left Outer Join durch
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Dann werden b1 und b2 NULL sein, wobei ein Wert von a1 keinen übereinstimmenden Wert von b1 hat.
Kann ich einen Standardwert für b2 anstelle von NULL angeben? Beachten Sie, dass COALESCE funktioniert hier nicht, weil ich nicht den Standardwert Potential NULLs in b2 außer Kraft setzen möchten , wo es ist ein Wert von b1 Anpassung a1.
Das heißt, mit a und b als
CREATE TABLE a (a1)
AS VALUES (1),
(2),
(3) ;
CREATE TABLE b (b1,b2)
AS VALUES (1, 10),
(3, null) ;
a1 b1 | b2
--- --------
1 1 | 10
2 3 | NULL
3
und eine Standardeinstellung für b2 von beispielsweise 100, möchte ich das Ergebnis erhalten
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
In diesem einfachen Fall könnte ich es "von Hand" tun, indem ich prüfe, ob b1 in der Ausgabe NULL ist. Ist das die beste Option im Allgemeinen, oder gibt es eine normalere und ordentlichere Möglichkeit?
quelle
sql
(was "SQL als Abfragesprache" bedeutet. Dieses Tag kennzeichnet kein bestimmtes DBMS-Produkt oder keinen bestimmten Dialekt). Der Teil:[b2]=CASE WHEN ... END
ist ein ungültiger (Standard-) SQL-Ausdruck.Die ursprüngliche Antwort auf diese Frage blieb ungeklärt.
Mit einer
CASE
AussageBei Verwendung dieser Methode wird ausgenutzt, dass in einer anderen Spalte ein anderer
IS NOT NULL
b.b1
Wert vorhanden ist. Wenn dieser Wert in diesem Fall null ist, wissen wir, dass der Join fehlgeschlagen ist.Dies wird vollkommen funktionieren und genau das erzeugen, was Sie wollen.
Unterauswahl verwenden
Wenden Sie diese Methode nicht an, sie ist eine Idee für den Aufbau. Weiter lesen.
Wenn wir keine
NOT NULL
Spalten haben , die wir so ausnutzen können, brauchen wir etwas, um eine Spalte zu erstellen, die für uns so funktionieren kann ...Verwenden eines Zeilenvergleichs
Noch einfacher, als einen falschen Wert zu erzwingen, für den wir vergleichen können, ist es, die Zeile zu vergleichen. In PostgreSQL hat die Zeile einen Wert nach dem Namen der Tabelle. Gibt beispielsweise
SELECT foo FROM foo
eine Zeile vom Typfoo
(ein Zeilentyp) aus der Tabelle zurückfoo
. Hier testen wir, ob diese Zeile null ist. Dies funktioniert so lange wie jede SpalteIS NOT NULL
. Und wenn jede SpalteIS NULL
in Ihrer Tabelle, dann trollen Sie nur.quelle
b1
in derCASE
Lösung verwendete Spalte muss nicht nullwertfähig sein. Die Bauarbeiten in beiden Fällen.Ich finde COALESCE in diesem Fall sehr nützlich. Es wird der erste Nicht-NULL-Wert aus einer Liste zurückgegeben:
quelle