2011-08-30 90 views
12

我有一个计算列我需要的位域,这里式的一个示例:如何强制将计算列的数据类型强制为不允许空值的位域?

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

使用此公式计算列组的数据类型是int

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

随着整个案件一CONVERT声明,数据类型为bitAllow Nulls

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

与结果的表达式一个CONVERT声明同样的事情,数据类型为bitAllow Nulls

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

或者有更明智的做法吗?

回答

21

ISNULL作为第二个参数(只要提供它,或者可以转换成这样)来计算列定义。

这是少数几个必须使用ISNULL而不是(通常设计得更好)COALESCE的地方之一。 SQL Server具有特殊情况下的逻辑来认识到ISNULL具有非空的第二个参数表示不可空的结果。

例如为:

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

这也可以例如使用视图定义。

+0

你或任何人有一个想法,如果有与以下备选句法的示例之间的性能差异:'情况下,当([some_field] <[Some_Other_field]) 然后ISNULL(CONVERT(位0) ,0) else ISNULL(CONVERT(bit,1),1) end'? – tomosius

+0

@tomosius - 我不希望在事物的宏观体系中出现*可测量*差异(例如,与数据访问和网络开销相关的I/O成本)。我还怀疑你的变种可能会重新提出这个问题试图避免的问题 - 即“经常检查我们知道它不行的情况下”CASE“表达式经常被分析为可能无效。 –