Załóżmy, że mam tabele a (z kolumną a1) ib (z kolumnami b1 i b2) i wykonuję lewe łączenie zewnętrzne
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Wtedy b1 i b2 będą miały wartość NULL, gdzie wartość a1 nie ma pasującej wartości b1.
Czy mogę podać wartość domyślną dla b2 zamiast NULL? Zauważ, że COALESCE nie będzie działać tutaj, bo nie chcę, aby zastąpić domyślną wartość potencjalnych wartości null w b2 gdzie jest wartość b1 dopasowania A1.
To znaczy, z aib jako
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
i domyślnie dla b2, powiedzmy 100, chcę uzyskać wynik
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
W tym prostym przypadku mógłbym to zrobić „ręcznie”, sprawdzając, czy b1 ma wartość NULL na wyjściu. Czy to ogólnie najlepsza opcja, czy może jest to bardziej standardowy i bardziej uporządkowany sposób?
postgresql
join
Tom Ellis
źródło
źródło
sql
(co oznacza „SQL język zapytań”. Ten znacznik nie oznacza żadnego konkretnego produktu DBMS ani dialektu). Część:[b2]=CASE WHEN ... END
jest niepoprawnym (standardowym) wyrażeniem SQL.Oryginalna odpowiedź na to pytanie nie została wyjaśniona, więc dajmy to jeszcze raz.
Za pomocą
CASE
oświadczeniaKorzystając z tej metody, wykorzystujemy to ,
IS NOT NULL
że mamy inną wartość w innej kolumnie, która w tym przypadku,b.b1
jeśli ta wartość jest pusta, to wiemy, że połączenie nie powiodło się.To całkowicie zadziała i wygeneruje dokładnie to, czego chcesz.
Korzystanie z podselekcji
Nie używaj tej metody, to pomysł na rozbudowę. Czytaj dalej.
Jeśli nie mamy żadnych
NOT NULL
kolumn, które moglibyśmy wykorzystać w ten sposób, potrzebujemy czegoś, aby stworzyć kolumnę, która mogłaby dla nas działać w ten sposób ...Korzystanie z porównania wierszy
Jeszcze łatwiejsze niż wymuszanie fałszywej wartości, dla której możemy porównać, jest porównanie wiersza. W PostgreSQL wiersz ma wartość według nazwy tabeli. Na przykład
SELECT foo FROM foo
zwraca wiersz typufoo
(który jest typem wiersza) z tabelifoo
. Tutaj sprawdzamy, czy ten ROW jest zerowy. Będzie to działać tak długo, jak każda kolumnaIS NOT NULL
. A jeśli każda kolumnaIS NULL
w tabeli, to po prostu trollujesz.źródło
b1
użyta wCASE
roztworze nie musi mieć wartości zerowej. Budowa działa w obu przypadkach.W tym przypadku uważam, że COALESCE jest bardzo przydatny. Zwróci pierwszą wartość inną niż NULL z listy:
źródło