我有一个包含8列的MySQL表,每列都是INT(1) default 0
。
如何测试8个字段中只有一个是否等于1?
答案 0 :(得分:2)
试试这个:
where 1 = (field1 = 1) + (field2 = 1) + ...
这是基于MySQL中的每个条件都变成1
或0
。如果所有条件的添加均为1
,则表示只有1
(或true
)。
答案 1 :(得分:0)
这样可行:
SELECT field1 + field2 + field3 + field4 + field5 + field6 + field7 + field8 = 1
AS ONLY_ONE
如果和为1,则返回1
(TRUE),如果大于1(多于一组)或小于1(无设置),则返回0(FALSE)。
如果您没有严格模式下的表/ db(因此可以使用0和1以外的值),您可以这样做:
SELECT (field1 > 0) + (field2 > 0) + (field3 > 0) ... = 1 AS ONLY_ONE
因为表达式将为true(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;