Misalkan saya memiliki tabel a (dengan kolom a1) dan b (dengan kolom b1 dan b2) dan saya melakukan gabungan luar kiri
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Kemudian b1 dan b2 akan menjadi NULL di mana nilai a1 tidak memiliki nilai yang cocok dengan b1.
Bisakah saya memberikan nilai default untuk b2, bukan NULL? Perhatikan bahwa Bersatu tidak akan bekerja di sini, karena saya tidak ingin nilai default untuk menimpa potensi NULLs di b2 di mana ada adalah nilai a1 pencocokan b1.
Yaitu, dengan a dan b sebagai
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
dan default untuk b2 dari, katakanlah, 100, saya ingin mendapatkan hasilnya
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
Dalam kasus sederhana ini saya bisa melakukannya "dengan tangan" dengan melihat apakah b1 NULL dalam output. Apakah itu pilihan terbaik secara umum, atau ada cara yang lebih standar dan lebih rapi?
postgresql
join
Tom Ellis
sumber
sumber
sql
(yang berarti "SQL the query language". Tag itu tidak menunjukkan produk atau dialek DBMS tertentu). Bagian:[b2]=CASE WHEN ... END
adalah ekspresi SQL yang tidak valid (standar).Jawaban asli untuk pertanyaan ini tidak dapat dijelaskan, jadi mari kita coba lagi.
Menggunakan
CASE
pernyataanDengan menggunakan metode ini, kami mengeksploitasi bahwa kami memiliki nilai lain di kolom berbeda yang
IS NOT NULL
dalam hal inib.b1
jika nilai itu nol, maka kami tahu bahwa gabungan gagal.Ini benar-benar akan berfungsi, dan menghasilkan hal yang persis Anda inginkan.
Menggunakan sub-SELECT
Jangan gunakan metode ini, itu ide yang membangun. Teruslah membaca.
Jika kita tidak memiliki
NOT NULL
kolom apa pun yang dapat kita manfaatkan seperti itu, kita perlu sesuatu untuk membuat kolom yang dapat berfungsi seperti itu bagi kita ...Menggunakan perbandingan baris
Lebih mudah lagi jika kemudian memaksakan nilai palsu yang dapat kita bandingkan, adalah membandingkan baris. Di PostgreSQL, baris memiliki nilai berdasarkan nama tabel. Misalnya,
SELECT foo FROM foo
mengembalikan baris tipefoo
(yang merupakan tipe baris), dari tabelfoo
. Di sini kami menguji untuk melihat apakah ROW itu nol. Ini akan bekerja selama setiap kolomIS NOT NULL
. Dan, jika setiap kolomIS NULL
di meja Anda, maka Anda hanya trolling.sumber
b1
digunakan dalamCASE
solusi tidak harus non-nullable. Konstruksi bekerja dalam kedua kasus.Saya menemukan COALESCE sangat berguna dalam kasus itu. Ini akan mengembalikan nilai NULL pertama dari daftar:
sumber