Perbedaan antara "dan" dan "&"

13

Saya mencoba memahami urutan diutamakan untuk operasi logis dan memiliki kode berikut:

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

print @T and @F

dan itu mengembalikan kesalahan sebagai

Sintaksis salah di dekat kata kunci 'dan'.

Saya mengganti 'dan' dengan '&', dan kode berfungsi lagi. Mengapa kode lama tidak berfungsi? Saya menggunakan SQL server.

Jason
sumber

Jawaban:

29
print @T & @F

Kembali 0

& adalah operator Bitwise AND .

Operator & bitwise melakukan logika bitwise AND antara dua ekspresi, masing-masing mengambil bit yang sesuai untuk kedua ekspresi. Bit dalam hasil diatur ke 1 jika dan hanya jika kedua bit (untuk bit saat ini sedang diselesaikan) dalam ekspresi input memiliki nilai 1; jika tidak, bit dalam hasil diatur ke 0.

Dalam kasus Anda @T & @Fmemutuskan untuk1 & 0 dan mengembalikan hasil tipe data BITdengan nilai0

Ketika diteruskan ke PRINToperator, bithasil ini secara implisit dilemparkan ke string dan hasilnya dihasilkan ke klien.


print @T and @F

Cukup banyak yang salah dengan itu.

AND

Menggabungkan dua ekspresi Boolean dan mengembalikan TRUE ketika kedua ekspresi TRUE

bittidak sama dengan boolean. Mereka tidak dapat dipertukarkan dan SQL Server tidak akan secara implisit dilemparkanbit ke tipe data boolean bila diperlukan (SQL Server tidak mengimplementasikan tipe data SQL Boolean.).

Jadi, Anda perlu menggunakan ekspresi seperti

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

dari pada

@T and @F

Meski begitu masalah Anda belum selesai - PRINTtoh tidak menerima ekspresi boolean. Anda dapat menggunakan ekspresi CASEseperti di bawah ini.

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
Martin Smith
sumber
Terima kasih atas jawaban anda! Saya benar-benar belajar banyak dari itu!
Jason