如何将计算列的数据类型强制为不允许空值的位字段?

Dav*_*b60 13 t-sql sql-server sql-server-2008 sql-server-2008-r2

我有一个计算列,我需要一个位字段,这里是一个公式示例:

case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end
Run Code Online (Sandbox Code Playgroud)

使用此公式计算列集的数据类型为int.

强制使用正确数据类型的最佳方法是什么?

通过CONVERT对整个案例的陈述,数据类型就是bitAllow Nulls

CONVERT([bit], 
        case when (([some_field] < [Some_Other_field]) 
        then 0 
        else 1 
        end,
        0)
Run Code Online (Sandbox Code Playgroud)

CONVERT关于结果表达式的语句也是如此,bit但数据类型却是如此Allow Nulls

case when (([some_field] < [Some_Other_field]) 
then CONVERT([bit], (0), 0) 
else CONVERT([bit], (1), 0) 
end
Run Code Online (Sandbox Code Playgroud)

或者有一种更聪明的方法吗?

Dam*_*ver 22

将计算列定义ISNULL包含在内,以您喜欢的方式作为第二个参数(假设它有点,或者可以转换为这样).

这是您必须使用的少数几个地方之一,ISNULL而不是(通常更好的设计)COALESCE.SQL Server具有特殊的大小写逻辑,可以实现ISNULL带有非null的第二个参数表示不可为空的结果.

例如:

ISNULL(CONVERT(bit,case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end),0)
Run Code Online (Sandbox Code Playgroud)

这也可以用于例如视图定义.


Mik*_*son 12

如果您持久保存计算列,则可以指定not null.http://msdn.microsoft.com/en-us/library/ms186241.aspx

CONVERT([bit], 
        case when (([some_field] < [Some_Other_field]) 
        then 0 
        else 1 
        end,
        0) PERSISTED NOT NULL
Run Code Online (Sandbox Code Playgroud)