在 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
好,但仍然需要将1
和0
转换为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 隐含位的主要内容,如果未能解决你的问题,请参考以下文章