在 SQL Server 中使用常量 1 或 0 隐含位

Posted

技术标签:

【中文标题】在 SQL Server 中使用常量 1 或 0 隐含位【英文标题】:Imply bit with constant 1 or 0 in SQL Server 【发布时间】:2010-11-13 10:54:22 【问题描述】:

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

例如

在这种情况下(它是 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)

【问题讨论】:

【参考方案1】:
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 ...

【讨论】:

一个nit,在第5行应该是“else 0”。 为了使代码更具可读性,我们标准化了我们的 SQL,现在当我们需要表达真/假时使用声明的位变量。 @Damien McGivern:当我有很多 CAST 时,我发现它也很有用 使用声明的变量对性能有影响吗?如果您想在VIEW 或单语句表值UDF 中使用它怎么办? @Dai 琐碎。我确实说过“多个这样的表达式”,这通常是一个存储过程【参考方案2】:

您可以在视图中添加第二个 sn-p 作为 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

【讨论】:

这可行,但缺点是 cast() 返回 NULL 类型。 @Dan 总是有ISNULL( CAST(1 AS bit), CAST(0 AS bit) )(是的,我对 SQL 的冗长感到非常沮丧......)【参考方案3】:

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

【讨论】:

【参考方案4】:

比 gbn 的更简洁:

假设CourseId 非零

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

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

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

【讨论】:

我喜欢这个解决方案的巧妙之处......但原始帖子没有提到 FC.CourseId 不为零。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

让这个答案更有用并解释或提供图书馆/文档的链接 您好,欢迎来到 SO。请解释你的答案。 虽然IIF 看起来比case when ... else ... end 好,但仍然需要将10 转换为BIT 类型。【参考方案7】:

很遗憾,没有。您必须单独转换每个值。

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于在 SQL Server 中使用常量 1 或 0 隐含位的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中使用参数或常量时的性能差异

SQL Server2008函数大全(完整版)

SQL Server2008函数大全(完整版)

传递值为 null 的变量与传递常量 null 时,Sql Server UDF 的行为不同

SQL Server2008函数大全(完整版)

SQL Server 中的常量函数(使用函数的慢视图)