it-swarm.com.de

Kann ich einen Standard für einen linken äußeren Join angeben?

Angenommen, ich habe Tabellen a (mit Spalte a1) und b (mit Spalten b1 und b2) und führe einen linken äußeren Join durch

SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1

Dann sind b1 und b2 NULL, wobei ein Wert von a1 keinen übereinstimmenden Wert von b1 hat.

Kann ich anstelle von NULL einen Standardwert für b2 angeben? Beachten Sie, dass COALESCE hier nicht funktioniert, da ich nicht möchte, dass der Standardwert potenzielle NULL-Werte in b2 überschreibt, wobei is ein Wert von b1 ist, der mit a1 übereinstimmt.

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, ich möchte 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 sehe, ob b1 in der Ausgabe NULL ist. Ist das die beste Option im Allgemeinen oder gibt es einen standardmäßigeren und saubereren Weg?

22
Tom Ellis
SELECT a.a1,b.b1,  
    CASE WHEN b.b1 is NULL THEN 5 ELSE b.b2 END AS b2  
FROM a LEFT OUTER JOIN b  
ON a.a1 = b.b1
25
Mordechai

Ich finde COALESCE in diesem Fall sehr nützlich. Es wird der erste Nicht-NULL-Wert aus einer Liste zurückgegeben:

SELECT
 a.a1,
 b.b1,
 COALESCE (b.b2, 100) AS b2
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);
4
Rob

Die ursprüngliche Antwort auf diese Frage blieb ungeklärt. Lassen Sie uns dies noch einmal versuchen.

Verwenden einer CASE -Anweisung

Mit dieser Methode nutzen wir das wir haben einen anderen Wert in einer anderen Spalte als IS NOT NULL in diesem Fall b.b1 Wenn dieser Wert null ist, wissen wir, dass der Join fehlgeschlagen ist.

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.b1 is NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b  
  ON (a.a1 = b.b1);

Dies wird vollständig funktionieren und genau das generieren, was Sie wollen.

Verwenden eines Sub-SELECT

Verwenden Sie diese Methode nicht, es ist eine Aufbauidee. Lesen Sie weiter.

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 funktioniert ...

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.cond IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN (
  SELECT true AS cond, b.*
  FROM b
) AS b
  ON (a.a1 = b.b1);

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 mit dem Namen der Tabelle. Beispielsweise gibt SELECT foo FROM foo Eine Zeile vom Typ foo (bei der es sich um einen Zeilentyp handelt) aus der Tabelle foo zurück. Hier testen wir, ob diese REIHE null ist. Dies funktioniert so lange wie jede Spalte IS NOT NULL. Und wenn jede Spalte IS NULL In Ihrer Tabelle ist, dann trollen Sie nur.

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);
2
Evan Carroll