如何从多个布尔列中检查至少一个为真或所有列值在 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
数据类型,我使用它来代替,它基本上是 0
和 1
(很明显)。所以你的表会变成零和一的表,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:使用列值在另一列中切片字符串