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

时间:2011-08-30 13:48:45

标签: sql-server tsql sql-server-2008 sql-server-2008-r2

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

case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end

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

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

对整个案例使用CONVERT语句,数据类型为bit,但Allow Nulls

CONVERT([bit], 
        case when (([some_field] < [Some_Other_field]) 
        then 0 
        else 1 
        end,
        0)

对结果表达式的CONVERT语句也一样,数据类型为bit,但Allow Nulls

case when (([some_field] < [Some_Other_field]) 
then CONVERT([bit], (0), 0) 
else CONVERT([bit], (1), 0) 
end

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

2 个答案:

答案 0 :(得分:21)

将计算列定义包装在ISNULL中,将您喜欢的任何内容包装为第二个参数(假设它有点,或者可以转换为这样)。

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

E.g:

ISNULL(CONVERT(bit,case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end),0)

这也可用于例如查看定义。

答案 1 :(得分:11)

如果您保留计算列,则可以指定not nullhttp://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