Sự khác biệt giữa những người khác


13

Tôi đang cố gắng hiểu thứ tự ưu tiên cho các hoạt động logic và có mã sau:

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

print @T and @F

và nó trả về một lỗi như

Cú pháp không chính xác gần từ khóa 'và'.

Tôi đã thay thế 'và' bằng '&' và mã hoạt động trở lại. Tại sao mã cũ không hoạt động? Tôi đang sử dụng máy chủ SQL.

Câu trả lời:


29
print @T & @F

Trả về 0

&là toán tử Bitwise AND .

Toán tử & bitwise thực hiện logic logic bit giữa hai biểu thức, lấy từng bit tương ứng cho cả hai biểu thức. Các bit trong kết quả được đặt thành 1 khi và chỉ khi cả hai bit (đối với bit hiện tại được giải quyết) trong các biểu thức đầu vào có giá trị là 1; mặt khác, bit trong kết quả được đặt thành 0.

Trong trường hợp của bạn, @T & @Fgiải quyết 1 & 0và trả về kết quả của kiểu dữ liệu BITcó giá trị0

Khi được truyền cho PRINTtoán tử, bitkết quả này được truyền ngầm thành chuỗi và kết quả đầu ra cho máy khách.


print @T and @F

Có khá nhiều sai với nó.

AND

Kết hợp hai biểu thức Boolean và trả về TRUE khi cả hai biểu thức là TRUE

bitkhông giống như boolean. Chúng không thể hoán đổi cho nhau và SQL Server sẽ không hoàn toàn bitchuyển sang kiểu dữ liệu boolean khi cần (SQL Server không triển khai kiểu dữ liệu Boolean SQL.).

Vì vậy, bạn sẽ cần phải sử dụng một biểu thức như

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

thay vì

@T and @F

Ngay cả sau đó các vấn đề của bạn vẫn chưa kết thúc - PRINTdù sao cũng không chấp nhận biểu thức boolean. Bạn có thể sử dụng biểu thức CASEnhư dưới đây.

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

Cảm ơn câu trả lời của bạn! Tôi thực sự đã học được rất nhiều từ đó!
Jason
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.