Súc tích, nhanh chóng (đặc biệt là có nhiều hàng), yêu thích của tôi liên quan đến khả năng đọc và cũng sẽ hoạt động với bản sao:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
Trả về TRUE
/ FALSE
.. hoặc NULL
- chỉ trong trường hợp chính xác một hàng với val IS NULL
, bởi vì count()
không bao giờ trả lại NULL
hoặc không có hàng.
Thứ hai 1
trong ví dụ chỉ xảy ra giống như lần đầu tiên, vì ví dụ của bạn.
Các truy vấn trong câu hỏi không thành công với NULL
các giá trị. Hãy xem xét bản demo đơn giản:
CREATE TABLE foo (id int, val int);
INSERT INTO foo VALUES (1, 1),(2, NULL);
SELECT 'yes'
WHERE EXISTS(SELECT * FROM foo WHERE val = 1)
AND NOT EXISTS(SELECT * FROM foo WHERE val <> 1);
IS DISTINCT FROM
sẽ khắc phục điều này, nhưng nó vẫn có thể thất bại với các bản sao trong val
- mà bạn đã loại trừ trong trường hợp này.
Câu trả lời của bạn hoạt động tốt.
Trả về 'yes'
/ không có hàng.
Tôi thích hình thức ngắn hơn này, mặc dù. Đừng quên rằng PostgreSQL (không giống như Oracle) có một boolean
loại thích hợp .
SELECT array_agg(val) = array[1] FROM foo;
Trả về TRUE
/ FALSE
/ NULL
.