如何从多个布尔列中检查至少一个为真或所有列值在 SQL Server 中为假

Posted

技术标签:

【中文标题】如何从多个布尔列中检查至少一个为真或所有列值在 SQL Server 中为假【英文标题】:How to check from multiple Boolean columns at least one is true or all column values are false in SQL Server 【发布时间】:2018-09-04 05:51:19 【问题描述】:

表格格式:

+---------+---------+-----------------+
| column1 | column2 | column3| column4| 
+---------+---------+-----------------+
| value1  | true    | true   | false  |
| value2  | true    | false  | true   |
| value4  | false   | false  | false  |
+---------+---------+-----------------+

第 1 到 4 列的数据类型为布尔值。

我想检查所有这些布尔列值是否为假或至少一个列值为真。

有没有更好的方法使用 SQL Server 查询来做到这一点? 预期输出:

+---------+---------+-----------------+
| column1 | column2 | column3| column4| 
+---------+---------+-----------------+
| value1  | true    | true   | false  | = true
| value2  | true    | false  | true   | = true
| value4  | false   | false  | false  | = false
+---------+---------+-----------------+

【问题讨论】:

SQL Server 没有boolean 数据类型 column1 是否位? value1、value2 和 value4 意味着至少 3 个可能的非 NULL 状态的位不会发生 您要跨还是跨求和?这是人们离开 cmets 的部分,您应该已经显示了预期的输出。 我想要跨行 @PriyankaDesai “跨行”对您意味着什么?根据您发布的内容,您期望输出什么?投票结束不清楚和no attempt 【参考方案1】:

如果bit 数据类型,只需使用bitwise 运算符。

DECLARE @foo table (column1 bit, column2 bit, column3 bit, column4 bit)
INSERT @foo VALUES (1, 1, 0, 1), (0, 1, 0, 0), (0, 0, 0, 0)

SELECT
    CASE
        WHEN column1 | column2 | column3 | column4 = 0 THEN 'All false'
        ELSE 'Some true' 
    END
FROM @foo;

非常简单,不涉及 CAST

【讨论】:

【参考方案2】:

在 SQL Server 中,没有布尔类型,但有一个 bit 数据类型,我使用它来代替,它基本上是 01(很明显)。所以你的表会变成零和一的表,0 - 假,1 - 真。因此,要检查四列中是否至少有一列为真,只需将所有值相加并检查它是否大于零(如果全部为假,则总和等于零),例如:

case when cast(column1 as int) + 
          cast(column2 as int) + 
          cast(column3 as int) + 
          cast(column4 as int) > 0 then 'at least one true' else 'all false' end

【讨论】:

你会得到一个错误,“数据类型位和位在加法运算符中不兼容。”【参考方案3】:

SQL Server 没有Boolean 类型,它有BIT 类型来表示布尔数据

select a.column1, 
      case when sum(a.value) >= 1 
           then 'one or more is true' else 'all is false' end [CheckBoolVal]
from table t cross apply (
        values (column1, col2), (column1, col3), (column1, col4) )a(column1, value)
group by a.column1

结果:

column1 CheckBoolVal
value1  one or more is true
value2  one or more is true
value4  all is false

【讨论】:

以上是关于如何从多个布尔列中检查至少一个为真或所有列值在 SQL Server 中为假的主要内容,如果未能解决你的问题,请参考以下文章

加入多个布尔值

如何检查任何多个“错误”布尔值是不是为真?

Pandas DataFrame:使用列值在另一列中切片字符串

检查至少十分之二的布尔值是真的

如何根据布尔值在 AngularJS 中切换 ng-show?

SQL - 计算一个列值在另一列中的出现