2009-03-21 19 views
27

Ci scusiamo per la domanda di base. Che cosa fa l'operatore & fare in questo SQLOperatore e commerciale (&) in SQL Server Clausola WHERE

WHERE (sc.Attributes & 1) = 0 

sc è un alias per una tabella che contiene una colonna attributes.

Sto cercando di capire un po 'di SQL in un report e quella linea sta facendo tornare 0 voci. Se lo commento, funziona. Ho una conoscenza SQL limitata e non sono sicuro di cosa stia facendo il & 1.

risposta

44

& is the bitwise logical and operator - Esegue l'operazione su 2 valori interi.

WHERE (sc.Attributes & 1) = 0 

Il codice precedente controlla se sc.Attributes è un numero pari. Il che equivale a dire che il primo bit non è impostato.

A causa del nome della colonna però: "Attributi", quindi il valore "1" è probabilmente solo qualche bandiera che ha un significato esterno.

È comune utilizzare 1 cifra binaria per ogni bandiera memorizzata in un numero per attributi. Quindi per testare per il primo bit si usa sc.Attributes & 1, per testare per il secondo si usa sc.Attributes & 2, per testare il terzo si usa sc.Attributes & 4, per testare il quarto si usa sc. Attributi & 8, ...

La parte = 0 sta verificando per vedere se il primo bit NON è impostato.

Alcuni esempi binari: (== per mostrare il risultato dell'operazione)

//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 Molto ben spiegato. –

+1

@Andrew Hare: Grazie :) –

+0

Grazie. Mi scuso per una domanda così semplice. Apprezzo davvero l'ottima risposta e il tempo impiegato. – Jimmymcnulty

1

Visto che hai contrassegnato questo server come SQL, ho pensato di aggiungere qualcosa da una prospettiva diversa, come anche corse in uno di questi questa settimana.

Queste possono compromettere le prestazioni delle query se utilizzate nel predicato. Molto facile da produrre un tuo esempio. Ecco il frammento di codice dalla mia interrogazione

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

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

semplicemente definendo ogni colonna con un valore corretto questo ha permesso l'ottimizzatore per rimuovere una ricerca di segnalibro e le statistiche di rendimento ha mostrato un aumento delle prestazioni X10.

+0

Tutte le operazioni matematiche sulle colonne non sono sganciabili. Non solo un po 'di matematica. – SpaceGhost440