Anda dapat menggunakan tipe data rentang dan menyimpan setiap tipe terpisah dalam satu baris.
Untuk sampel Anda:
-- The table
CREATE TABLE sets(id text, range int4range);
-- Values of set A
INSERT INTO sets VALUES('A', '[1,1]'),('A','[7,7]'),('A','[9,13]');
-- Values of set B
INSERT INTO sets VALUES('B','[1,1]'),('B','[7,7]'),('B','[10,10]');
Untuk memeriksa apakah B adalah subset dari A, Anda dapat menggabungkan keduanya dengan semua tupel yang rentang A berisi rentang B:
SELECT b.range
FROM sets b JOIN sets a
ON a.range @> b.range
WHERE a.id='A' AND b.id='B'
Dengan itu, Anda dapat memeriksa apakah semua nilai dari himpunan B ada di hasil di atas (yang berarti bahwa semua rentang B berisi setidaknya satu rentang A):
SELECT NOT EXISTS(
SELECT 1 FROM sets q WHERE q.id='B' AND q.range NOT IN (
SELECT b.range
FROM sets b JOIN sets a
ON a.range @> b.range
WHERE a.id='A' AND b.id='B'
));
Untuk mendapatkan persimpangan, Anda dapat menggabungkan keduanya dan mengecualikan yang kosong:
SELECT * FROM (
SELECT a.range * b.range AS intersec
FROM sets a CROSS JOIN sets b WHERE a.id='A' AND b.id='B'
) i WHERE NOT isempty(i.intersec);
Satu masalah tentang pendekatan ini, adalah bahwa Anda harus menyimpan hanya rentang yang terpisah melalui tupel yang berbeda. Misalnya, rentang [1,5] dan [4,7] dari suatu himpunan harus berada dalam tupel dengan [1,7] saja. Untuk memastikannya, Anda dapat menyisipkannya ke dalam tabel sementara (saat menyisipkan atau memperbarui), mereka bergabung secara silang dengan tabel itu sendiri dengan tupel yang tumpang tindih dan mereka bergabung dengan tupel dan menjaga yang lain tetap seperti semula.