ความแตกต่างระหว่าง“ และ” และ“ &”


13

ฉันพยายามที่จะเข้าใจลำดับความสำคัญของการดำเนินการทางตรรกะและมีรหัสต่อไปนี้:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F

และจะส่งคืนข้อผิดพลาดเป็น

ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'และ'

ฉันแทนที่ 'และ' ด้วย '&' และรหัสทำงานอีกครั้ง ทำไมรหัสเดิมไม่ทำงาน ฉันใช้เซิร์ฟเวอร์ SQL

คำตอบ:


29
print @T & @F

ผลตอบแทน 0

&เป็นผู้ประกอบการบิตและ

ตัวดำเนินการ & bitwise ดำเนินการตรรกะระดับบิตและ AND ระหว่างนิพจน์ทั้งสองโดยรับบิตที่สอดคล้องกันสำหรับนิพจน์ทั้งสอง บิตในผลลัพธ์ถูกตั้งค่าเป็น 1 ถ้าหากทั้งสองบิต (สำหรับบิตปัจจุบันกำลังแก้ไข) ในนิพจน์อินพุตมีค่า 1; มิฉะนั้นบิตของผลลัพธ์จะถูกตั้งค่าเป็น 0

ในกรณีของคุณ@T & @Fจะแก้ไข1 & 0และส่งกลับผลลัพธ์ของประเภทข้อมูลที่BITมีค่า0

เมื่อส่งไปยังPRINTโอเปอเรเตอร์bitผลลัพธ์นี้จะถูกส่งไปยังสตริงและผลลัพธ์ผลลัพธ์ไปยังไคลเอ็นต์โดยปริยาย


print @T and @F

มีความผิดค่อนข้างมากเลยทีเดียว

AND

รวมสองบูลีนนิพจน์และคืนค่า TRUE เมื่อทั้งสองนิพจน์เป็น TRUE

bitไม่เหมือนกับบูลีน พวกเขาไม่สามารถใช้แทนกันได้และ SQL Server จะไม่ส่งbitข้อมูลประเภทบูลีนโดยนัยเมื่อจำเป็น (SQL Server ไม่ได้ใช้ประเภทข้อมูล SQL Boolean)

ดังนั้นคุณจะต้องใช้การแสดงออกเช่น

@T = 'TRUE' AND @F = 'TRUE'

แทน

@T and @F

แม้ว่าปัญหาของคุณจะไม่จบ - PRINTก็ไม่ยอมรับนิพจน์บูลีน คุณสามารถใช้นิพจน์CASEดังต่อไปนี้

PRINT CASE 
          WHEN     (@T = 'TRUE' AND @F = 'TRUE') THEN 'True' 
          WHEN NOT (@T = 'TRUE' AND @F = 'TRUE') THEN 'False' 
          ELSE 'Unknown' -- SQL uses three valued logic
      END

ขอบคุณสำหรับคำตอบ! ฉันได้เรียนรู้มากมายจากสิ่งนั้น!
Jason
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.