如何从多个布尔列中检查至少一个是真的,或者SQL Server中的所有列值都为false

时间:2018-03-26 06:48:12

标签: sql-server sql-server-2016

表格式:

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

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

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

使用SQL Server查询有没有更好的方法? 预期产出:

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

3 个答案:

答案 0 :(得分:2)

如果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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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