我知道,SQL Server没有布尔数据类型和你最好的选择是使用BIT数据类型。
我的问题是什么布尔表达式评价。 例如,如果我有说法
expr1 AND expr2
如果表达式1的真实,expr2的是假的,他们做内部评估与值1和0的位? 然后AND运算符检查双边?
我想,这是不是因为那么下面应该工作的情况:
select 1 where 1 and 0
所以做的SQL Server内部有一个布尔数据类型?
下面的工作
select 1 where 1 = 0
select 1 where 1 = 0 and 0 = 0
但是这个
select 1 where 1 and 0
报告
消息4145,级别15,状态1,行1中的上下文指定的非布尔型,其中一个条件是预期的,邻近“和”的表达式。
这意味着内部SQL服务器处理的表达式为布尔值,但为何没有访问这些数据类型。
SQL服务器确实有一个Boolean
数据类型。 您可以打开的逻辑运算符(Transact-SQL)手册页,找到下面的语句:
逻辑运算符测试的一些条件的真相。 逻辑运算符,如比较运算符,返回一个布尔数据类型与TRUE,FALSE,或者UNKNOWN的值。
只是,你不能以同样的方式使用这种类型的,你可以使用其他的Transact-SQL数据类型。 举例来说,你不能声明布尔变量或参数,添加布尔列的表,转换为/从一个布尔值。 但你可以有布尔表达式 ,并在那里他们被要求(在上下文中使用它们WHERE
, ON
,检查约束...)。 您还可以将布尔运算符来这些表达式: AND
, NOT
等。 (运营商像<
, =
, LIKE
等也可以被认为是布尔值,在这个意义上,他们返回布尔结果,但它们的操作数实际上从未布尔)。
因此,要总结, 有 SQL Server中的布尔类型,但它的使用是有限的,如上所述。 为什么? 我的回答可能是一个愚蠢的一个,很抱歉,但是这是一个我很满意:这是他们选择了它要的方式。
逻辑运算符的结果真的还是假的。 因此,在您的例子中,你得到的结果,如果expr1
和expr2
为真。 要检查其真实与否是你每个表情做了手术。
所以,你对类似的位值比较如列column_bit = 0
,这导致真还是假。 如果expr1
为真, expr2
是假的你的结果是逻辑AND运算错误。
编辑:
你select 1 where 1 and 0
不行,因为你不使用一个比较操作。 1 = 1和0 = 0的作品,例如但其废话:)