我正在编写一个SQL查询,该查询在where子句中检查不正确的设备.为了执行此操作,我需要一个接一个地检查每个设备的修订周期,因此此子句将结果限制为正确的设备(没有任何不正确的周期):
where not exists(select * from trevision_cycle cycle
where cycle.id_equipment = equip.id and cycle.`status` = 'NO_OK')
但是,现在我想引入一个查询参数,以便仅根据其值检索正确的设备或不正确的设备.假设我称其为不正确,所以我想做的事情与这里所做的相同:
where (not incorrect and not exists(select * from trevision_cycle cycle
where cycle.id_equipment = equip.id and cycle.`status` = 'NO_OK'))
or (incorrect and exists (select * from trevision_cycle cycle
where cycle.id_equipment = equip.id and cycle.`status` = 'NO_OK'))
因此,如果存在错误的标志,请检查设备是否具有至少一个错误的修订周期.否则,仅检索所有正确的设备.该查询看起来很多余,但是使用逻辑XNOR可以实现相同的结果.
我对此有更好的选择吗?
更新资料
样本数据
Equipment 1 -> Has one NO_OK cycle
Equipment 2 -> All its cycles are OK
Query with incorrect = true -> Returns only Equipment 1
Query with incorrect = false -> Returns only Equipment 2
解决方法:
如果要像这样创建函数XNOR,则引用This Fellow’s博客:
--XNOR
CREATE FUNCTION XNOR (@a bit, @b bit) RETURNS bit AS
BEGIN
RETURN @a ^ @b ^ 1
END
然后,您可以使用它来简化语句:
where dbo.XNOR(incorrect, exists(select * from trevision_cycle cycle
where cycle.id_equipment = equip.id and cycle.`status` = 'NO_OK'))
编辑:对不起,对于MySQL,您必须使用其XOR而不是’^'(‘^’是SQL Server的XOR函数)来创建函数.我不确定其余语法对于MySQL是否正确,但是您可以理解:
--XNOR
CREATE FUNCTION XNOR (@a bit, @b bit) RETURNS bit AS
BEGIN
RETURN @a XOR @b XOR 1
END
如果您有理由不组成一个新函数来执行此操作,那么以下内容在逻辑上是等效的:
where incorrect XOR exists(select * from trevision_cycle cycle
where cycle.id_equipment = equip.id and cycle.`status` = 'NO_OK') XOR 1