กระชับเร็ว (โดยเฉพาะกับหลายแถว) สิ่งที่ฉันชอบเกี่ยวกับความสามารถในการอ่านและจะใช้งานร่วมกับ dupes ได้เช่นกัน:
SELECT count(*) = 1 AND min(val) = 1 FROM foo;
ส่งคืนTRUE
/ FALSE
.. หรือNULL
- เฉพาะในกรณีที่มีหนึ่งแถวด้วยval IS NULL
เพราะcount()
ไม่เคยส่งคืนNULL
หรือไม่มีแถว
ตัวอย่างที่สอง1
นั้นเกิดขึ้นเหมือนกับในลำดับแรกเนื่องจากตัวอย่างของคุณ
แบบสอบถามในคำถามล้มเหลวด้วยNULL
ค่า พิจารณาตัวอย่างง่ายๆ:
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
จะแก้ไขปัญหานี้ แต่ก็ยังอาจล้มเหลวหากมีรายการซ้ำval
ซึ่งคุณได้ตัดสิทธิ์สำหรับกรณีนี้แล้ว
คำตอบของคุณใช้ได้ดี
ส่งคืน'yes'
/ ไม่มีแถว
ฉันต้องการแบบฟอร์มที่สั้นกว่านี้ แต่ อย่าลืมว่า PostgreSQL (ซึ่งแตกต่างจากออราเคิล) มีที่เหมาะสมประเภทboolean
SELECT array_agg(val) = array[1] FROM foo;
ผลตอบแทนTRUE
/ /FALSE
NULL