当用作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)
答案 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)
COALESCE
与ISNULL()
类似,但会返回第一个非空。
非零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