问题 为什么我不能在SQL case语句中使用位字段作为布尔表达式?


我想根据位字段是真还是假来有条件地选择一些东西。这是我最初尝试的语法:

CASE WHEN isSoon THEN 'Soon' ELSE 'Not so soon' END As HowSoon

这对我来说很有意义,因为“WHEN”后面必须是一个布尔表达式 isSoon 是的,因为它有点领域。但是,这不起作用。我最终要做的是:

CASE WHEN isSoon = 1 THEN 'Soon' ELSE 'Not so soon' END As HowSoon

这对我来说似乎是多余的......就像写作一样 if(isSoon == True) 在编程语言而不是更直观 if(isSoon) 并反对谷物。为什么SQL设置如此?是因为位字段不是真正的布尔值吗?


885
2017-12-02 13:00


起源

你能说出你正在使用的数据库提供商吗? MySQL似乎没有问题。 - Alin Purcaru
这也让我感到烦恼,但是sql没有这样设置。就像将参数传递给SP时不能使用计算一样(例如,你不能这样做 exec ListPermissionsByUser @DomainName + '\' + @UserName) - Raj More


答案:


因为位数据类型 不是布尔类型,它是用于优化位存储的数据类型。

字符串“true”和“false”可以转换为一点这一事实可能会产生误导,但引用来自 MSDN ,有点 “整数数据类型,可以取值为1,0或NULL。”


13
2017-12-02 13:04



这似乎没有回答为什么。是的它是1,0或null。但这只是一个可以为空的布尔值(假设列允许空值)。为什么SQL人员决定将其视为一个 supersmallint 而不是它代表的bool,并用作99.9999%的时间。 - Vaccano
@Vaccano:实际上是答案。具有3种可能状态的数据类型(可空的bool - 在SQL情况下的位)与具有2种可能状态的数据类型(bool)非常不同 - Michal Levý