มุมมองของฉันเกี่ยวกับเรื่องนี้คือเอกสารประกอบทำให้เห็นได้ชัดเจนว่าเจตนาคือ CASE ควรลัดวงจร แอรอนพูดถึงมีหลายกรณี (ฮ่า!) ที่สิ่งนี้แสดงให้เห็นว่าไม่เป็นความจริงเสมอไป
จนถึงตอนนี้สิ่งเหล่านี้ได้รับการยอมรับว่าเป็นข้อบกพร่องและได้รับการแก้ไขแล้ว - แม้ว่าจะไม่จำเป็นต้องอยู่ใน SQL Server รุ่นหนึ่งที่คุณสามารถซื้อและแก้ไขได้ในวันนี้ (ข้อผิดพลาดการพับแบบคงที่ ข้อผิดพลาดที่อาจเกิดขึ้นใหม่ล่าสุด - ซึ่งเดิมรายงานโดย Itzik Ben-Gan - ยังไม่ได้รับการตรวจสอบ (ไม่ว่าจะเป็นแอรอนหรือฉันจะเพิ่มลงในการเชื่อมต่อในไม่ช้า)
เกี่ยวข้องกับคำถามเดิมมีปัญหาอื่น ๆ เกี่ยวกับ CASE (และดังนั้น COALESCE) ที่มีการใช้งานฟังก์ชั่นผลกระทบด้านข้างหรือแบบสอบถามย่อย พิจารณา:
SELECT COALESCE((SELECT CASE WHEN RAND() <= 0.5 THEN 999 END), 999);
SELECT ISNULL((SELECT CASE WHEN RAND() <= 0.5 THEN 999 END), 999);
แบบฟอร์ม COALESCE มักส่งคืนค่า NULL โดยมีรายละเอียดเพิ่มเติมที่https://connect.microsoft.com/SQLServer/feedback/details/546437/coalesce-subquery-1-may-return-null
ปัญหาที่แสดงให้เห็นพร้อมกับการเพิ่มประสิทธิภาพการแปลงและการติดตามการแสดงออกทั่วไปหมายความว่ามันเป็นไปไม่ได้ที่จะรับประกันว่า CASE จะลัดวงจรในทุกสถานการณ์ ฉันสามารถเข้าใจถึงกรณีที่อาจไม่สามารถทำนายพฤติกรรมได้โดยการตรวจสอบผลลัพธ์ของแผนการแสดงสาธารณะแม้ว่าฉันจะไม่ทำซ้ำในวันนั้น
โดยสรุปแล้วฉันคิดว่าคุณสามารถมั่นใจได้อย่างสมเหตุสมผลว่า CASE จะลัดวงจรโดยทั่วไป (โดยเฉพาะอย่างยิ่งถ้าคนที่มีความสามารถพอสมควรตรวจสอบแผนการดำเนินการและแผนปฏิบัติการนั้น 'บังคับใช้' พร้อมกับคำแนะนำแผนหรือคำแนะนำ) การรับประกันแบบสัมบูรณ์คุณต้องเขียน SQL ที่ไม่มีนิพจน์เลย
ฉันไม่คิดว่าจะเป็นเรื่องที่น่าพอใจอย่างมาก
CASE
จะประเมินวงจรซ้าย - ขวา - ขวาเสมอ )