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

时间:2009-07-23 16:01:41

标签: sql sql-server tsql bit

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

e.g。

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

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

要使它成为一种类型,我必须投射两个值。

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

是否有一种简单的方法可以将值表示为位类型而无需每次都进行转换?

(我正在使用MS SQL Server 2005)

7 个答案:

答案 0 :(得分:194)

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

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 ...

答案 1 :(得分: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

答案 2 :(得分:5)

不,但您可以转换整个表达式而不是该表达式的子组件。实际上,在这种情况下,这可能会使更少可读。

答案 3 :(得分:3)

比gbn更加浓缩:

假设CourseId非零

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

COALESCEISNULL()类似,但会返回第一个非空。

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

答案 4 :(得分:1)

不幸的是,没有。您必须单独投射每个值。

答案 5 :(得分:0)

在SELECT中使用的表达式可以是

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)

答案 6 :(得分:-1)

享受这个:) 不单独抛出每个值。

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc