2009-03-21 21 views
27

Temel soru için özür dilerim. Ne & operatörü bunu yapar SQLBir SQL Server'DAKİ (ve) işleç WHERE Maddesi

WHERE (sc.Attributes & 1) = 0 

sc yapmak bir sütun attributes içeren bir tablo için bir diğer adıdır.

Bazı raporları SQL'de anlamaya çalışıyorum ve bu satır 0 giriş yaptı. Bunu açıklarsam çalışır. SQL bilgisini kısıtlıyorum ve & 1'un ne yaptığından emin değilim.

cevap

44

& is the bitwise logical and operator - İşlemi 2 tamsayı değerleri üzerinde gerçekleştirir.

WHERE (sc.Attributes & 1) = 0 

Yukarıdaki kod, sc.Attributes çift sayı olup olmadığını kontrol eder. İlk bitin belirlenmediğini söylemekle aynı şey.

"Nitelikler" sütununun adından dolayı "1" değeri muhtemelen yalnızca dışsal bir anlamı olan bir bayraktır.

Nitelikler için bir numarada depolanan her bayrak için 1 ikili basamağın kullanılması yaygındır. Bu nedenle, sc.Attributes & 2, sc.Attributes & 2, sc.Attributes & 2, sc.Attributes kullandığınız üçüncü için sınamak için d. Öznitelikleri & 8, ...

= 0 bölümü, ilk bitin OLMADIĞINI sınamak için sınanıyor.

Bazı ikili örnekler

: (== operasyonun sonucunu göstermek için)

//Check if the first bit is set, same as sc.Attributes&1 
11111111 & 00000001 == 1 
11111110 & 00000001 == 0 
00000001 & 00000001 == 1 


//Check if the third bit is set, same as sc.Attributes&4 
11111111 & 00000100 == 1 
11111011 & 00000100 == 0 
00000100 & 00000100 == 1 
+1

+1 Çok güzel açıkladı. –

+1

@Andrew Hare: Teşekkürler :) –

+0

Teşekkürler. Böyle basit bir soru için özür dilerim. Mükemmel cevap ve zamanı gerçekten takdir edin. – Jimmymcnulty

1

bu kadar sql server etiketli olarak görünce, ben de içine koşarken ben farklı bir açıdan bir şeyler eklemek düşündüm Bunlardan biri bu hafta.

Bunlar, yüklemede kullanıldığında sorgularınızın performansını olumsuz etkileyebilir. Kendi başına bir örnek üretmek çok kolay. İşte sadece bu bir yer imi arama kaldırmak için optimize edici izin ve performans istatistiklerini bir X10 performans artış gösterdi uygun bir değere sahip her sütunu tanımlayarak benim sorgusu

WHERE 
advertiserid = @advertiserid 
AND (is_deleted & @dirty > 0) 

WHERE 
advertiserid = @advertiserid 
AND (is_deleted > 0 AND @dirty > 0) 

gelen pasajıdır.

+0

Sütunlardaki tüm matematik işlemleri sarsılmaz. Sadece matematiği değil. – SpaceGhost440