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

6 浏览
0 Comments

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

表格格式:\n+---------+---------+-----------------+\n| 列1 | 列2 | 列3 | 列4 |\n+---------+---------+-----------------+\n| 值1 | true | true | false |\n| 值2 | true | false | true |\n| 值4 | false | false | false |\n+---------+---------+-----------------+\n\n列1到列4的数据类型为布尔型。\n我想要检查这些布尔列的值是否全为false或至少有一个列的值为true。\n是否有更好的方法使用SQL Server查询来实现这个目标?\n预期输出:\n+---------+---------+-----------------+\n| 列1 | 列2 | 列3 | 列4 |\n+---------+---------+-----------------+\n| 值1 | true | true | false | = true\n| 值2 | true | false | true | = true\n| 值4 | false | false | false | = false\n+---------+---------+-----------------+\n

0
0 Comments

问题的原因是SQL Server没有Boolean类型,而是使用BIT类型来表示布尔数据。当需要检查多个布尔列中至少有一个为真或者所有列的值都为假时,需要使用特定的查询语句来实现。

解决方法是使用CASE语句和SUM函数来判断布尔列的值。通过使用CROSS APPLY子查询将多个布尔列的值合并为一个列,并对该列进行求和。如果求和结果大于等于1,则表示至少有一个布尔列的值为真;否则,表示所有布尔列的值都为假。

下面是一个示例查询语句:

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

通过以上查询语句,我们可以判断多个布尔列中是否至少有一个为真,或者所有列的值都为假。

0
0 Comments

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

case when cast(column1 as int) + 
          cast(column2 as int) + 
          cast(column3 as int) + 
          cast(column4 as int) > 0 then '至少一个true' else '全部为false' end

你会得到一个错误,"The data types bit and bit are incompatible in the add operator."

0
0 Comments

问题出现的原因是需要检查多个布尔列中是否至少有一个为真或者全部为假。解决方法是使用位运算符,如果使用的是bit数据类型,可以直接使用位运算符进行操作。具体的解决方法是声明一个表,包含多个布尔列,并插入相应的值。然后使用SELECT语句进行查询,使用位运算符将所有列进行比较,如果结果为0,则表示全部为假,否则表示至少有一个为真。简单直观,无需进行CAST操作。

0