Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中使用常量1或0暗示位_Sql_Sql Server_Tsql_Bit - Fatal编程技术网

在SQL Server中使用常量1或0暗示位

在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

在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)
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是非零的。