我有一个 8 列的 MySQL 表,每列都是INT(1) default 0
.
如何测试以查看 8 个字段中是否只有一个等于 1?
尝试这个:
where 1 = (field1 = 1) + (field2 = 1) + ...
这是在 MySQL 中的每个条件都转换为1
or的基础上工作的0
。如果所有条件相加是1
,那么这意味着只有一个是1
(或true
)。
这会起作用:
SELECT field1 + field2 + field3 + field4 + field5 + field6 + field7 + field8 = 1
AS ONLY_ONE
如果总和为 1,则返回1
(TRUE),如果总和大于 1(多于一组)或小于 1(未设置),则返回 0(FALSE)。
如果您没有严格模式下的表/数据库(因此可以使用 0 和 1 以外的值),您可以执行以下操作:
SELECT (field1 > 0) + (field2 > 0) + (field3 > 0) ... = 1 AS ONLY_ONE
因为表达式将为真 (1) 并因此被添加为1
是否为 1 或更大(设置)的值。
如果没有默认集,那么您可以进一步细化查询:
SELECT COALESCE(field1 > 0, 0) + COALESCE(field2 > 0, 0) + COALESCE(field3 > 0, 0) ...
= 1 AS ONLY_ONE
所以覆盖你的基地的最好方法是:
SELECT
COALESCE(field1 > 0, 0) +
COALESCE(field2 > 0, 0) +
COALESCE(field3 > 0, 0) +
COALESCE(field4 > 0, 0) +
COALESCE(field5 > 0, 0) +
COALESCE(field6 > 0, 0) +
COALESCE(field7 > 0, 0) +
COALESCE(field8 > 0, 0) +
= 1 AS ONLY_ONE
FROM my_table;