布尔运算符的意外行为

时间:2015-12-21 12:07:31

标签: sql boolean bit-manipulation

为什么许多语言(据我可以检查)按顺序and然后or(像往常一样)处理条件和按位布尔运算符,但是MS SQL Server和PostgreSQL没有?

的JavaScript

a = true || true && true && false;         // true
a = true | true & true & false;            // 1
a = 1 | 1 & 1 & 0;                         // 1

爪哇

a = true || true && true && false;         // true
a = true | true & true & false;            // true 
a = 1 | 1 & 1 & 0;                         // 1

Python

a = True or True and True and False        // true
a = 1 | 1 & 1 & 0                          // 1

的Delphi

a := true or true and true and false;      // true
a := 1 or 1 and 1 and 0;                   // 1

PHP

$a = true | true & true & false;           // 1
$a = true || true && true && false;        // 1

c(CentOS下的gcc)

a = true || true && true && false;         // true
a = true | true & true & false;            // true
a = 1 || 1 && 1 && 0;                      // 1
a = 1 | 1 & 1 & 0;                         // 1

的MySQL

select 1 | 1 & 1 & 0 a                     -- 1
select true | true & true & false          -- 1
select true || true && true && false       -- 1

SQL Server

select 1 | 1 & 1 & 0 a                     -- 0 !
select cast(1 as bit) | cast(1 as bit) &
       cast(1 as bit) & cast(0 as bit)     -- 0 !

的PostgreSQL

select true or true and true and false a   -- true
select 1 | 1 & 1 & 0 a                     -- 0 !
select 1::bit | 1::bit & 1::bit & 0::bit a -- 0 !

1 个答案:

答案 0 :(得分:2)

|和& SQL中的运算符是bitwise operators,而不是逻辑运算符。按位|和&在precedence in SQL Server中等于MySQL & is higher than |

SQL中的逻辑运算符为andor