从SQL中的位字段获取-1

时间:2014-03-26 19:01:51

标签: sql sql-server tsql

我写了这个

select ISNULL((select convert(bit, null) ), -1)

并且预期-1作为结果,但获得了1 ....为什么?由于那一点我猜,但为什么?

如果它是NULL,如何从位字段中获取-1

8 个答案:

答案 0 :(得分:7)

位只能是0,1和NULL

0也是假的,其他一切都是真的。

查看

的结果

SQL Fiddle DEMO

select ISNULL((select convert(bit, null) ), -1) Returns1;
select ISNULL((select convert(bit, null) ), 1) Returns1;
select ISNULL((select convert(bit, null) ), 100) GuessWhat_Returns1;
select ISNULL((select convert(bit, null) ), 0) Returns0;

最重要的部分

来自bit (Transact-SQL)

  

转换为位会将任何非零值提升为1.

答案 1 :(得分:2)

数据类型为bit的字段只能为0,1或NULL。因此,通过转换为位,您可以将其限制为这三个值中的一个。 ISNULL(cast(BitColumn as int), -1)会做到这一点。

答案 2 :(得分:1)

基本上,如果ISNULL中的第一个参数实际为空,则您指定的-1是“替换值”。你是那个指定应该返回什么的人。

有意义吗?

请在此处阅读:ISNULL() T-SQL Reference

答案 3 :(得分:1)

您获得1的原因与以下内容返回1

的原因相同
select cast(-1 as bit)

bit只包含一位,因此无法代表-1。选项为01。在现代计算机上,-1通常表示为所有1,因此它变为1这一事实是有道理的。

答案 4 :(得分:1)

将其转换为int:

select ISNULL(CAST((SELECT CONVERT(bit, NULL) ) AS INT), -1)

答案 5 :(得分:1)

你错了 这里是如何完成的:

select (ISNULL((select convert(bit, null)), -1))-2

开个玩笑!

位只能是0,1和NULL。就像@astander所说的那样 如果你会发现更多的价值观 - 你将成为下一个比尔盖茨

答案 6 :(得分:1)

返回null

select convert(bit, null)

这些都返回1

select convert(bit, -1) 
select convert(bit, 2)
select convert(bit, 3)

我怀疑它正在将-1转换为isnull

的一部分

但这会引发算术溢出错误

select CONVERT(tinyint, 256)

Astander有答案 转换为位会将任何非零值提升为1 位不一定存储为位。

答案 7 :(得分:0)

select ISNULL(CAST((SELECT CONVERT(bit, NULL) ) AS INT), -1)

这给了你正确的答案。