กระชับเร็ว (โดยเฉพาะกับหลายแถว) สิ่งที่ฉันชอบเกี่ยวกับความสามารถในการอ่านและจะใช้งานร่วมกับ 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/ /FALSENULL