Jenis rentang terdiri dari batas bawah dan batas atas, yang dapat disertakan atau dikecualikan. Kasus penggunaan umum (dan default untuk jenis rentang) adalah menyertakan bagian bawah dan kecualikan batas atas.
Tidak termasuk tumpang tindih rentang tampak jelas. Ada contoh kode yang bagus di manual
Selain itu, buat batasan pengecualian lain menggunakan operator yang berdekatan -|-
untuk juga mengecualikan berdekatan entri. Keduanya harus didasarkan pada GiST indeks karena GIN saat ini tidak didukung untuk ini.
Untuk menjaganya tetap bersih, saya akan menerapkan [)
batas (termasuk bawah dan tidak termasuk atas) untuk semua entri dengan CHECK
batasan menggunakan fungsi rentang:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, tsr tsrange
, CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&)
, CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-)
, CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);
db<>main biola di sini
(Fiddle SQL Lama)
Sayangnya, ini menghasilkan dua indeks GiST identik untuk mengimplementasikan kedua batasan pengecualian, di mana satu akan cukup, secara logis. Itu tampaknya menjadi kekurangan dari implementasi saat ini (hingga setidaknya Postgres 11).