有没有办法在SQL Server中获取没有强制转换的布尔值?

Ear*_*rlz 8 t-sql sql-server casting

我发现像这样的简单代码无效是非常奇怪的:

select * from table where field=true
Run Code Online (Sandbox Code Playgroud)

显然是另一种选择

select * from table where field='true'
Run Code Online (Sandbox Code Playgroud)

好的,我想我可以忍受.出于这样或那样的原因,我最近需要做这样的事情:

select true as somefield,...
Run Code Online (Sandbox Code Playgroud)

获得类型和一切正确的替代方案更加丑陋:

select cast('true' as bit) as somefield,...
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?实际上是否存在一些内置的方法来获取真值或假值作为布尔值而不进行转换?

And*_*hop 20

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

select CAST(1 as bit) as somefield
Run Code Online (Sandbox Code Playgroud)


Mei*_*ude 6

Sql Server没有可以存储在表中的布尔数据类型,但它确实包含可以存储的位数据类型.

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

了解两者之间的区别非常重要.

SELECT *
FROM Table
WHERE Field = 1 --Field = true
Run Code Online (Sandbox Code Playgroud)

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


Sco*_*nro 6

值"TRUE"和"FALSE"是特殊字符串,可以隐式转换为bit类型的变量.这个摘录来自MSDN文档.

字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0.

请注意,这些值似乎不区分大小写.

这就是你的第二个代码片段中的where子句有效的原因(我假设该字段被定义为一个位).

select * from table where field='true'

如果不以任何方式指定目标类型的位,则"TRUE"和"FALSE"不再被视为特殊值,而是保持简单的字符串值.这就是你的第三个片段中需要演员表的原因.

select cast('true' as bit) as somefield,...
Run Code Online (Sandbox Code Playgroud)

MSDN声明位文字(或那里引用的常量)是数字0和1.

位常量由数字0或1表示,并未用引号括起来.如果使用大于1的数字,则将其转换为1.

在某些情况下,此信息可能有所帮助,但要注意文字值0和1被解释为int而不是bit.以下语句都返回'int'来证明这一点.

select sql_variant_property(0, 'BaseType')
select sql_variant_property(1, 'BaseType')
Run Code Online (Sandbox Code Playgroud)