在SQL Server中使用常量1或0暗示位
在select语句中用作字段值时,是否可以将1或0表示为位 e、 g 在本例中,基于ICourseBased的语句(它是select语句的一部分)的类型为int在SQL Server中使用常量1或0暗示位,sql,sql-server,tsql,bit,Sql,Sql Server,Tsql,Bit,在select语句中用作字段值时,是否可以将1或0表示为位 e、 g 在本例中,基于ICourseBased的语句(它是select语句的一部分)的类型为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) e
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)否,但您可以强制转换整个表达式,而不是该表达式的子组件。实际上,在这种情况下,这可能会使它的可读性降低。不幸的是,没有。您将不得不单独转换每个值
cast (
case
when FC.CourseId is not null then 1 else 0
end
as bit)
SELECT ...,
IsCoursedBased = CAST(
CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
AS BIT
)
FROM fc
强制转换规范为“强制转换(表达式为类型)”。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 ...
您可以添加第二个代码段作为视图中基于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
比gbn的略为浓缩: 假设
CourseId
为非零
CAST (COALESCE(FC.CourseId, 0) AS Bit)
COALESCE
类似于ISNULL()
,但返回第一个非Null值
非零的
CourseId
会将类型强制转换为1,而空的CourseId
会导致COALESCE返回下一个值,0如果您希望列是位而不是空的,则应该将ISNULL放在强制转换之前
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)
享受这个:)
不单独强制每个值
cast (
case
when FC.CourseId is not null then 1 else 0
end
as bit)
SELECT ...,
IsCoursedBased = CAST(
CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
AS BIT
)
FROM fc
一个nit,应该是第5行的“else 0”。为了使代码更具可读性,我们标准化了SQL,现在在需要表示真/假时使用声明的位变量。@Damien McGivern:我发现当我有很多cast时它也很有用。使用声明的变量会影响性能吗?如果要在
视图
或单语句表值UDF
,该怎么办。我确实说过“多个这样的表达式”,这通常是一个存储过程。这是可行的,但缺点是cast()返回空类型。@但总是有ISNULL(cast(1为位)、cast(0为位))
(是的,我对SQL的冗长程度感到非常失望…)让这个答案更有用,并解释或提供到library/docsHello的链接,欢迎来到SO。请解释你的答案。虽然看起来比。。。其他的结束,仍需将1
和0
转换为位类型。我喜欢此解决方案的流畅性。。。但是原始帖子没有提到FC.CourseId是非零的。