返回 MySQL 中至少有 2 个或更多布尔列为“true”的记录

Ofe*_*all 0 mysql

我有一个表存储有关供应商的信息。其中大约有 10 个布尔列,指示供应商所属的部门。供应商可以属于多个部门。

如何查询表以查找具有多个布尔列标记为 true 的供应商?

我的tbl_vendor_departments专栏:

vendor_id(varchar) vendor_name(varchar) clothing(bool) automotive(bool) lawn_garden(bool) tools(bool)...等等。

Bil*_*win 5

在 MySQL 中,布尔值只是整数 0 或 1。因此您可以使用算术:

SELECT ...
FROM tbl_vendor_departments
WHERE (clothing + automotive + lawn_garden + tools) >= 2
Run Code Online (Sandbox Code Playgroud)

严格来说,在 MySQL 中,零是 false,任何非零值都是 true。因此,如果您的“布尔”列包含大于 1 的真实值(例如 42),您可能会得到意外的结果。为了补偿,您可以将 true 值反转为 false,然后再次反转。这应该将 42 转换为 0,然后再转换回 1。使用括号来控制运算符优先级。

SELECT ...
FROM tbl_vendor_departments
WHERE (
    (NOT NOT clothing) +
    (NOT NOT automotive) +
    (NOT NOT lawn_garden) +
    (NOT NOT tools)
) >= 2
Run Code Online (Sandbox Code Playgroud)

不过,不要尝试将此方法与其他 SQL 实现一起使用。大多数不以boolean与整数算术兼容的方式实现,因此上述查询将(并且应该,根据 ANSI SQL)生成错误。对于这些,您可以使用 CASE 表达式将 true 转换为 1:

SELECT ...
FROM tbl_vendor_departments
WHERE (
    CASE clothing    WHEN true THEN 1 ELSE 0 END +
    CASE automotive  WHEN true THEN 1 ELSE 0 END +
    CASE lawn_garden WHEN true THEN 1 ELSE 0 END +
    CASE tools       WHEN true THEN 1 ELSE 0 END
) >= 2
Run Code Online (Sandbox Code Playgroud)