【问题标题】:Imply bit with constant 1 or 0 in SQL Server在 SQL Server 中使用常量 1 或 0 隐含位
【发布时间】: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)

【问题讨论】:

    标签: sql sql-server tsql bit


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 2016-09-04
            • 2015-05-07
            • 1970-01-01
            • 1970-01-01
            • 2021-01-04
            • 1970-01-01
            • 1970-01-01
            • 2013-07-01
            • 1970-01-01
            相关资源
            最近更新 更多