168

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

例如

在这个 case 语句(它是 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)

4

8 回答 8

239
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 ...
于 2009-07-23T16:04:24.203 回答
11

您可以将第二个片段添加为视图中 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
于 2009-07-23T16:07:24.617 回答
6

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

于 2009-07-23T16:04:14.983 回答
5

比 gbn 的更简洁:

假设CourseId非零

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

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

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

于 2014-01-23T17:49:35.010 回答
4

如果您希望列是 BIT 而不是 NULL,则应将 ISNULL 放在 CAST 之前。

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased
于 2015-09-14T11:35:55.023 回答
2

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

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)
于 2017-01-25T22:29:59.233 回答
1

很不幸的是,不行。您必须单独转换每个值。

于 2009-07-23T16:04:21.863 回答
-2

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

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
于 2017-12-13T14:10:18.290 回答