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

时间:2011-12-07 22:30:19

标签: mysql

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

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

我的tbl_vendor_departments列:

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

3 个答案:

答案 0 :(得分:4)

在MySQL中,boolean只是一个整数0或1.所以你可以使用算术:

SELECT ...
FROM tbl_vendor_departments
WHERE (clothing + automotive + lawn_garden + tools) >= 2

严格地说,在MySQL中,零为假,任何非零值都为真。因此,如果“布尔”列包含大于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

不要尝试使用其他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

答案 1 :(得分:1)

我认为布尔值实际上被视为微小的整数(0或1)。在这种情况下,您可以添加所有布尔字段并检查结果是否> 1。

....
WHERE
  clothing + automotive + lawn_garden + .... + tools > 1

答案 2 :(得分:0)

我不知道它是否是一个有保证的功能(但怀疑它是)但是根据我的经验,布尔字段设置为true将始终为1,当为false时为零。因此,只需添加所有字段并选择总数为2或更多的记录即可完成工作。

相关问题