2009-03-21 23 views
27

Disculpe la pregunta muy básica. Lo que hace el operador & hacer en este SQLAmpersand (&) operador en un SQL Server WHERE Cláusula

WHERE (sc.Attributes & 1) = 0 

sc es un alias para una tabla que contiene una columna attributes.

Estoy tratando de entender algunos SQL en un informe y esa línea lo está haciendo devolver 0 entradas. Si lo comento, funciona. Tengo conocimiento de SQL limitado y no estoy seguro de qué está haciendo el & 1.

Respuesta

44

& is the bitwise logical and operator - Realiza la operación en 2 valores enteros.

WHERE (sc.Attributes & 1) = 0 

El código anterior comprueba si sc.Attributes es un número par. Lo cual es lo mismo que decir que el primer bit no está configurado.

Sin embargo, debido al nombre de la columna: "Atributos", entonces el valor "1" es probablemente solo una bandera que tiene algún significado externo.

Es común usar 1 dígito binario para cada indicador almacenado en un número para los atributos. Entonces, para probar el primer bit, use los atributos sc.Attributes & 1, para probar el segundo use sc.Attributes & 2, para probar el tercero use sc. Atributes & 4, para evaluar el cuarto que usa sc. Atributos & 8, ...

La parte = 0 está probando para ver si el primer bit NO está configurado.

Algunos ejemplos binarios: (== para mostrar el resultado de la operación)

//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 Muy bien explicado. –

+1

@Andrew Hare: Gracias :) –

+0

Gracias. Disculpas por una pregunta tan simple. Realmente aprecio la respuesta excelente y el tiempo empleado. – Jimmymcnulty

1

Viendo como ha etiquetado este servidor como SQL, pensé que me gustaría añadir algo desde un ángulo diferente, como también se topó uno de estos esta semana.

Esto puede dañar el rendimiento de sus consultas si se usa en el predicado. Muy fácil de fabricar un ejemplo tuyo. Aquí está el fragmento de mi consulta

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

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

simplemente definiendo cada columna con un valor adecuado esto permitió que el optimizador para eliminar una búsqueda de marcadores y estadísticas de rendimiento mostró un aumento de rendimiento X10.

+0

Todas las operaciones matemáticas en las columnas no son sargeables. No solo un poco de matemáticas. – SpaceGhost440