Різниця між "і" та "&"


13

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

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

print @T and @F

і він повертає помилку як

Неправильний синтаксис біля ключових слів "і".

Я замінив "і" на "&", і код знову працює. Чому колишній код не працював? Я використовую SQL-сервер.

Відповіді:


29
print @T & @F

Повертається 0

&- оператор Побітовий І.

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

У вашому випадку @T & @Fвирішує значення 1 & 0і так повертає результат типу даних BITзі значенням0

При передачі PRINTоператору цей bitрезультат неявно передається на рядок, а результат виводиться клієнту.


print @T and @F

З цим досить багато не так.

AND

Поєднує два булеві вирази та повертає ІСТИНА, коли обидва вирази є ІСТИНИМИ

bitне те саме, що булеве. Вони не є взаємозамінними, і SQL Server bitпри необхідності неявно передається булевому типу даних (SQL Server не реалізує тип даних SQL Boolean.).

Тому вам потрібно буде використовувати такий вираз

@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

Дякую за вашу відповідь! Я насправді багато чого навчився з цього!
Джейсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.