我有一个存储有关供应商信息的表。在其中,大约有10个布尔列,表示供应商所属的部门。供应商可以属于多个部门。
如何查询表以查找具有多个标记为true的布尔列的供应商?
我的tbl_vendor_departments
列:
vendor_id
(varchar)vendor_name
(varchar)clothing
(bool)automotive
(bool)lawn_garden
(bool)tools
(bool )......等等。
答案 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或更多的记录即可完成工作。