在SQL Server中隐含1或0的常数

在select语句中作为字段值使用时,是否可以表示1或0?

例如

在这种情况下,语句(它是select语句的一部分)ICourseBased是inttypes的。

case when FC.CourseId is not null then 1 else 0 end as IsCoursedBased 

为了让它有点types,我必须投这两个值。

 case when FC.CourseId is not null then cast(1 as bit) else cast(0 as bit) end as IsCoursedBased 

有没有一种简单的方式来expression值的位types,而不必每次都投?

(我正在使用MS SQL Server 2005)

 cast ( case when FC.CourseId is not null then 1 else 0 end as bit) 

CAST规范是“CAST(expression式AStypes)”。 CASE是在这种情况下的expression

如果你有多个这样的expression式,我会声明位variables@true和@false并使用它们。 或者如果你真的想用UDF的话

 DECLARE @True bit, @False bit; SELECT @True = 1, @False = 0; --can be combined with declare in SQL 2008 SELECT case when FC.CourseId is not null then @True ELSE @False END AS ... 

您可以在视图中添加第二个片段作为ICourseBased的字段定义。

 DECLARE VIEW MyView AS SELECT case when FC.CourseId is not null then cast(1 as bit) else cast(0 as bit) end as IsCoursedBased ... SELECT ICourseBased FROM MyView 

不,但是你可以把整个expression式,而不是expression式的子部分。 事实上,这可能会使得它在这种情况下不太可读。

稍微比gbn更浓缩:

假设CourseId不为零

 CAST (COALESCE(FC.CourseId, 0) AS Bit) 

COALESCE就像一个ISNULL() ,但返回第一个非空值。

一个非零的CourseId将被types转换为1,而一个空的CourseId将导致COALESCE返回下一个值0

如果你想要列是BIT而不是NULL,你应该把CASN之前的ISNULL。

 ISNULL( CAST ( CASE WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0 END AS BIT) ,0) AS IsCoursedBased 

很不幸的是,不行。 您将不得不分别投射每个值。

IIF(FC.CourseId不是NULL,1,0)