在SQL Server中使用常量1或0表示位

Dam*_*ern 144 sql t-sql sql-server bit

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

例如

在这种情况下,语句(它是select语句的一部分)ICourseBased的类型为int.

case 
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)

要使它成为一种类型,我必须转换两个值.

case 
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方式将值表示为位类型,而不必每次都进行转换?

(我正在使用MS SQL Server 2005)

gbn*_*gbn 215

cast (
  case
    when FC.CourseId is not null then 1 else 0
  end
as bit)
Run Code Online (Sandbox Code Playgroud)

CAST规范是"CAST(表达式AS类型)".CASE是这种情况下的表达.

如果你有多个这样的表达式,我会声明位变量@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 ...
Run Code Online (Sandbox Code Playgroud)


Mic*_*tta 10

您可以在视图中将第二个片段添加为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
Run Code Online (Sandbox Code Playgroud)


Gar*_*ill 6

不,但您可以转换整个表达式而不是该表达式的子组件.实际上,在这种情况下,这可能会降低其可读性.


kpk*_*pkp 5

比 gbn 更简洁:

假设CourseId非零

CAST (COALESCE(FC.CourseId, 0) AS Bit)
Run Code Online (Sandbox Code Playgroud)

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

非零CourseId将被类型转换为 1,而 nullCourseId将导致 COALESCE 返回下一个值 0