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


154

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

例如

在这种情况下,语句(属于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)

Answers:


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

CAST规范为“ CAST(表达式AS类型)”。在这种情况下,CASE是一个表达式

如果您有多个这样的表达式,我会声明vars @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
的笨蛋,应该是“别的0”上线5
香农遣散

1
为了使代码更具可读性,我们对SQL进行了标准化,现在在需要表达true / false时使用声明的位变量。
Damien McGivern'2

@Damien McGivern:我发现它太有用,当我有很多蒙上
GBN

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

这可行,但是不利之处在于cast()返回NULL类型。
2015年

6

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


4

比gbn的缩略些:

假设CourseId非零

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

COALESCE类似于ISNULL(),但返回第一个非null值。

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




0

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

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

使这个答案更有用,并解释或提供指向库/文档的链接
happymacarts

您好,欢迎来到SO。请解释您的答案。
Chait

尽管IIF看起来比更好case when ... else ... end,人们仍然有投10到BIT类型。
Fabio A.

-1

享受这个:)无需单独转换每个值。

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.