我有一个计算列,我需要一个位字段,这里是一个公式的例子:
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
或者有一种更聪明的方法吗?
答案 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 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