Perbandingan Tipe Komposit
Perbedaan nilai baris di PostgreSQL dan DuckDB
SELECT
bisa dilakukan terhadap keseluruhan tabel dengan cara mengkueri nama tabel atau alias tabel:
SELECT T FROM T
-- atau
SELECT t FROM T AS t
Perbuatan ini dikenal sebagai row variable binding. Variabel baris t
terikat secara iteratif ke nilai baris, yang nilai dan tipe datanya ditentukan oleh baris pada tabel T
. Tak hanya kolom, ternyata baris juga memiliki tipe. Istilah resminya adalah tipe komposit. SELECT t FROM T AS t
akan menghasilkan satu kolom komposit t
dengan jumlah baris yang sama dengan baris tabel T
.
(a, b) --> nama field
t -> (1, NULL) ⎫
t -> (NULL, 1) ⎬ nilai baris
t -> (NULL, NULL) |
t -> (1, 1) ⎭
^ ^
(int, int) --> tipe field
Di PostgreSQL, kueri:
SELECT
t, x, y,
t IS NULL as t_is_null,
t IS NOT NULL as t_is_not_null,
NOT t IS NULL as not_t_is_null
FROM (VALUES (1,1),(NULL,1),(1,NULL),(NULL,NULL)) AS t(x, y);
-- menghasilkan
/*──────┬───┬───┬───────────┬───────────────┬───────────────┐
│ t │ x │ y │ t_is_null │ t_is_not_null │ not_t_is_null │
├───────┼───┼───┼───────────┼───────────────┼───────────────┤
│ (1,1) │ 1 │ 1 │ f │ t │ t │
│ (,1) │ │ 1 │ f │ f │ t │
│ (1,) │ 1 │ │ f │ f │ t │
│ (,) │ │ │ t │ f │ f │
└───────┴───┴───┴───────────┴───────────────┴──────────────*/
Nilai baris dianggap NULL
jika dan hanya jika semua field berisi nilai NULL
.
t -> (NULL, NULL)
Nilai barisnya adalah NULL
.
Di DuckDB, kueri yang sama, rupanya punya hasil lain:
/*───────────────────────┬───┬───┬───────────┬───────────────┬───────────────┐
│ t │ x │ y │ t_is_null │ t_is_not_null │ not_t_is_null │
├────────────────────────┼───┼───┼───────────┼───────────────┼───────────────┤
│ {'x': 1, 'y': 1} │ 1 │ 1 │ false │ true │ true │
│ {'x': NULL, 'y': 1} │ │ 1 │ false │ true │ true │
│ {'x': 1, 'y': NULL} │ 1 │ │ false │ true │ true │
│ {'x': NULL, 'y': NULL} │ │ │ false │ true │ true │
└────────────────────────┴───┴───┴───────────┴───────────────┴──────────────*/
Saya kirim ini ke Discord DuckDB karena nggak yakin apakah ini kekutu atau bukan. Salah satu pengembangnya bilang, bukan. “Di DuckDB, sebuah baris belum tentu NULL
hanya karena elemen turunannya semuanya NULL
.”