我试图了解逻辑运算的优先顺序并具有以下代码:
declare @T bit ='TRUE'
declare @F bit ='False'
print @T and @F
Run Code Online (Sandbox Code Playgroud)
它返回一个错误
关键字“and”附近的语法不正确。
我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。
Mar*_*ith 29
print @T & @F
Run Code Online (Sandbox Code Playgroud)
退货 0
&是按位与运算符。
& 按位运算符在两个表达式之间执行按位逻辑与运算,取两个表达式的每个对应位。当且仅当输入表达式中的两个位(对于正在解析的当前位)都为 1 时,结果中的位设置为 1;否则,结果中的位设置为 0。
在您的情况下@T & @F解析为1 & 0并因此返回BIT具有值的数据类型的结果0
当传递给PRINT运算符时,此bit结果被隐式转换为字符串,并将结果输出到客户端。
print @T and @F
Run Code Online (Sandbox Code Playgroud)
它有很多错误。
组合两个布尔表达式并在两个表达式都为 TRUE 时返回 TRUE
bit与布尔值不同。它们不可互换,并且 SQL Serverbit在需要时不会隐式转换为布尔数据类型(SQL Server 不实现 SQL 布尔数据类型。)。
所以你需要使用这样的表达式
@T = 'TRUE' AND @F = 'TRUE'
Run Code Online (Sandbox Code Playgroud)
代替
@T and @F
Run Code Online (Sandbox Code Playgroud)
即便如此,您的问题还没有结束 -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
Run Code Online (Sandbox Code Playgroud)