2010-06-22 105 views
4

我发现很奇怪,像这样简单的代码是无效的:有没有办法在不使用SQL Server强制转换的情况下获得布尔值?

select * from table where field=true 

替代显然是

select * from table where field='true' 

好吧,想我可以忍受的。因为我需要最近这样做或那样的原因:

select true as somefield,... 

另一种方法来获得类型和一切权利是更难看,但:

select cast('true' as bit) as somefield,... 

我缺少的东西?实际上是否有一些内置的方式来获得true或false的值作为布尔值而不用转换?

回答

6

SQL Server不具有布尔数据类型,你可以在表中存储,但它确实包含一个位数据类型可以存储。

但是,您看到的true关键字是一个布尔值。 Sql Server仅为其比较运算符的结果使用布尔数据类型,它可以返回三个值,TRUE,FALSE和UNKNOWN。

重要的是要知道两者之间的区别。

SELECT * 
FROM Table 
WHERE Field = 1 --Field = true 

要将布尔值存储在表中,请使用位数据类型。使用1 for true,0 for falseNull for unknown

3

使用1或0,假设您的字段是类型位。

select * from table where field=1 

select * from table where field=0 
16

位是TSQL中最常用来表示布尔值的数据类型。 我通常做这样的事情

select CAST(1 as bit) as somefield 
4

我要添加到当前所有的答案,只是多了一个方法来获取boolean没有在SQL Server铸造:

DECLARE @myTrue bit = 1; 
-- or two lines for old version of SQL Server 
-- DECLARE @myTrue bit; 
-- SET @myTrue = 1; 

SELECT @myTrue AS somefield 
6

值“真”和“假”是特殊字符串,可隐式转换到类型位的变量。本摘录来自MSDN documentation for bit。 TRUE和FALSE

字符串值可以被转换为比特值:TRUE被转换为1,而这些值似乎是不区分大小写FALSE转换到0

注。

这就是为什么你的第二个代码片段中的where子句起作用(我假定该字段被定义为一个位)。

select * from table where field='true'

不以任何方式指定位的目标类型,“TRUE”和“FALSE”不再被视为特殊值,并保持简单的字符串值。这就是为什么你的第三个片段需要演员。

select cast('true' as bit) as somefield,... 

MSDN states那个位文字(或常量作为它们被称为有)是数字0和1

位常数由数字0或1表示的,并且不包含在引号。如果使用大于1的数字,则将其转换为1。

此信息可能有助于在某些情况下,但请注意文字值0和1被解释为整数而不是位。下面的语句都返回了'int'来说明这一点。

select sql_variant_property(0, 'BaseType') 
select sql_variant_property(1, 'BaseType') 
1

不是一个真正的答案,但...

恰好碰到了,我被迫使用位转换的问题。那么,'强迫'在这里是一个'有点'的强词...相反,我更喜欢使用BIT转换。

我建了一个SQL查询一个C#方法里面,使用case语句,如:

case when foo = faa then 1 else 0 end as outcome 

,当结果被馈送到LINQ查询,结果类型解析为INT32。所以这个失败:

outcome = s.Field<bool>("outcome") 

我想要的结果,解决到了一点,所以我代替使用:

cast(case when foo = faa then 1 else 0 end as bit) as outcome 

点是,虽然TSQL可能会认为这是一个有点,而不是ADO没有。

总的来说,我想我是说,不要依赖框架(.NET或TSQL)来做你的肮脏工作...如果你想要一个BIT,把它当作BIT来投入:)

相关问题