Разница между «и» и «&»

13

Я пытаюсь понять порядок приоритета для логических операций и имею следующий код:

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

print @T and @F

и возвращает ошибку как

Неверный синтаксис рядом с ключевым словом «и».

Я заменил 'и' на '&', и код снова работает. Почему прежний код не работал? Я использую SQL-сервер.

Джейсон
источник

Ответы:

29
print @T & @F

Возвращает 0

&является побитовым оператором И

Оператор & bitwise выполняет побитовое логическое И между двумя выражениями, принимая каждый соответствующий бит для обоих выражений. Биты в результате устанавливаются в 1, если и только если оба бита (для текущего разрешаемого бита) во входных выражениях имеют значение 1; в противном случае бит в результате устанавливается в 0.

В вашем случае @T & @Fразрешает 1 & 0и поэтому возвращает результат типа данных BITсо значением0

При передаче PRINTоператору этот bitрезультат неявно приводится к строке, а результат выводится клиенту.


print @T and @F

Есть много плохого в этом.

AND

Объединяет два логических выражения и возвращает значение ИСТИНА, если оба выражения имеют значение ИСТИНА.

bitне то же самое, что логическое. Они не являются взаимозаменяемыми, и SQL Server не будет неявно приведен bitк логическому типу данных при необходимости (SQL Server не реализует логический тип данных SQL.).

Таким образом, вам нужно будет использовать выражение, как

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

вместо того

@T and @F

Даже тогда ваши проблемы не закончились - все PRINTравно не принимает логическое выражение. Вы можете использовать выражение, CASEкак показано ниже.

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
Мартин Смит
источник
Спасибо за Ваш ответ! Я действительно многому научился от этого!
Джейсон