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对整个案例的陈述,数据类型就是bit它Allow 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)