2012-06-21 125 views
1

我知道SQL Server没有布尔数据类型,最好的选择是使用BIT数据类型。SQL Server布尔运算符

我的问题是什么布尔表达式评估。例如,如果我有声明

expr1 AND expr2 

,如果expr1的是真实的,表达式2是假的,他们做内部评估与值1和0的位?然后AND运算符检查BIT?

我觉得这是不是这样的,因为那么下面应该工作:

select 1 where 1 and 0 

因此,没有SQL服务器内部有一个布尔数据类型?

以下工作

select 1 where 1 = 0 
select 1 where 1 = 0 and 0 = 0 

但这

select 1 where 1 and 0 

报告

消息4145,15级,状态1,行 在指定的非布尔类型的表达式在'和'附近预期条件的上下文。

这意味着内部sql服务器将表达式视为布尔值,但为什么不能访问该数据类型。

+0

@米奇小麦,我不明白 – alfoks

+0

我没有使用按位。你不明白我的问题。 – alfoks

+1

既然你不能*存储*表达式评估的结果,也不能提供一个值来代替正在评估的值,那有什么意义呢? –

回答

4

SQL Server确实有一个Boolean数据类型。您可以打开Logical Operators (Transact-SQL)手册页并找到以下声明:

逻辑运算符测试某些条件的真实性。逻辑运算符(如比较运算符)返回值为TRUE,FALSE或UNKNOWN的布尔型数据类型。

这只是您不能像使用其他Transact-SQL数据类型一样使用此类型。例如,你不能声明布尔变量或参数,向表中添加布尔列,从布尔值转换为/。但你可以有布尔表达式并在需要它们的上下文中使用它们(WHEREON,检查约束...)。您还可以将布尔型运算符应用于以下表达式:AND,NOT等。 (如<=LIKE等运营商也可以考虑布尔值,在这个意义上,他们返回布尔结果,但它们的操作数实际上从未布尔)

因此,要总结,有一个布尔类型在SQL Server中,但其使用是有限的,如上所述。为什么?我的回答可能是一个愚蠢的人,对不起,但这是我满意的一个:这是他们选择它的方式。

+0

这就是我想出的。 – alfoks

0

逻辑运算符结果为true或false。所以在你的例子中,如果expr1expr2为真,你会得到一个结果。检查它是否是你为每个表达做的操作。

所以你比较一个类似于位值column_bit = 0的列,结果是true或false。 如果您的expr1为true并且expr2为false,则逻辑AND运算符的结果为false。

编辑:

select 1 where 1 and 0不行,因为你不使用一个比较操作。 1 = 1 AND 0 = 0可以工作,例如但它的废话:)

+0

我明白你说什么。我的问题是,sql服务器如何处理这些布尔值true,false,unknown。 – alfoks

+0

我知道它不能工作,为什么!看来我无法正确解释我在问什么! – alfoks

+0

好逻辑运算符处理每个操作的真/假,但是对于一个操作没有“我是真/假占位符”,所以你需要总是比较一些东西。 – YvesR