MySql XNOR等效

我正在编写一个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
上一篇:C#-是运算符-检查所有可用转换的可铸性


下一篇:PHP参数化SQL查询特殊运算符