在 SQLServer 中以常量1或0隐含位

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

例如:。

在这种情况下,语句(是 select 语句的一部分) ICourseBase 的类型为 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

有没有一种简便的方法可以不用每次强制转换就可以将值表示为位类型?

(我使用的是 MSSQLServer2005)

119754 次浏览

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

不幸的是,没有。您必须逐个强制转换每个值。

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

CAST 规范是“ CAST (expression AS type)”。

如果有多个这样的表达式,我将声明 bit 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 ...

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

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

比 gbn 略浓缩:

假设 CourseId是非零的

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

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

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

如果希望列为 BIT 且 NOT NULL,则应将 ISNULL 放在 CAST 之前。

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

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

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

享受这个:) 不用逐个强制转换每个值。

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