Оператор амперсанда (&) в предложении WHERE SQL Server - PullRequest
30 голосов
/ 22 марта 2009

Извините за очень простой вопрос. Что делает оператор & в этом SQL

WHERE (sc.Attributes & 1) = 0 

sc - псевдоним таблицы, содержащей столбец attributes.

Я пытаюсь понять некоторый SQL в отчете, и эта строка заставляет его возвращать 0 записей. Если я это прокомментирую, это сработает. У меня ограниченные знания SQL, и я не уверен, что делает & 1.

Ответы [ 4 ]

46 голосов
/ 22 марта 2009

& - побитовый логический оператор - выполняет операцию с двумя целочисленными значениями.

WHERE (sc.Attributes & 1) = 0 

Приведенный выше код проверяет, является ли sc.Attributes четным числом. Что то же самое, что сказать, что первый бит не установлен.

Хотя из-за имени столбца: «Атрибуты», тогда значение «1», вероятно, является просто каким-то флагом, который имеет некоторое внешнее значение.

Обычно используется 1 двоичная цифра для каждого флага, хранящегося в числе для атрибутов. Таким образом, для проверки первого бита вы используете sc.Attributes & 1, для проверки второго вы используете sc.Attributes & 2, для проверки третьего вы используете sc.Attributes & 4, для проверки четвертого вы используете sc.Attributes & 8, ...

Часть = 0 проверяет, не установлен ли первый бит.

Некоторые бинарные примеры: (== показать результат операции)

//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
3 голосов
/ 22 марта 2009
3 голосов
/ 22 марта 2009
1 голос
/ 20 июня 2012

Видя, как вы пометили это как sql server, я подумал, что добавлю что-то под другим углом, как и на этой неделе

Это может ухудшить производительность ваших запросов, если они используются в предикате. Очень легко изготовить собственный пример. Вот фрагмент из моего запроса

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

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

, просто определяя каждый столбец с правильным значением, это позволило оптимизатору удалить поиск по закладкам, а статистика производительности показала увеличение производительности X10.

...