使用独占或在mysql中

时间:2014-01-17 08:43:51

标签: mysql

我有一张表格如下

表foobar

|foo|bar|
---------
| 1 | 1 |
| 1 | 0 |
| 0 | 1 |
| 0 | 0 |

我需要能够做类似的事情

select * from foobar
where foo = 1 or bar = 1

哪会返回以下

|foo|bar|
---------
| 1 | 0 |
| 0 | 1 |

意味着返回的值仅为1的值。在mysql中是否存在像这样的函数的XOR?

3 个答案:

答案 0 :(得分:15)

是的,XOR。 MySQL XOR运算符检查两个操作数(或表达式),如果一个或另一个但不是两个都为TRUE,则返回TRUE。

select * from foobar
where foo = 1 XOR bar = 1

XOR方程“A XOR B”的实际数学表示是“(A AND (NOT B)) OR ((NOT A) AND B)”。

答案 1 :(得分:1)

尝试这样:

select * from test where foo = 1 XOR bar = 1;

Sql Fiddle:http://sqlfiddle.com/#!2/079cc/4

答案 2 :(得分:0)

事实是SQL默认情况下不提供XOR。 MySQL确实很棒,因为它是一个如此常见的功能。话虽如此,当您有两个布尔值时,有一种简单的方法可以“实现”和XOR

... WHERE (foo = 1) = (bar = 0)

这将为您提供以下内容:

+-----+-----+-----+
| foo | bar |  =  |
+-----+-----+-----+
|  0  |  0  |  0  |
|  1  |  0  |  1  |
|  0  |  1  |  1  |
|  1  |  1  |  0  |
+-----+-----+-----+

要反转=列的结果,请使用相反的运算符<>,如下所示:

... WHERE (foo = 1) <> (bar = 0)

现在您有一个XNOR运算符:

+-----+-----+-----+
| foo | bar |  <> |
+-----+-----+-----+
|  0  |  0  |  1  |
|  1  |  0  |  0  |
|  0  |  1  |  0  |
|  1  |  1  |  1  |
+-----+-----+-----+

您还可以调整值,如:

... WHERE (foo = 1) = (bar = 1)

因此,如果您使用的是更纯的SQL数据库,例如PostgreSQL,但不提供布尔XOR(截至2019年),这对您来说是一个简单的解决方案,比完整的数据库容易得多:

(A AND (NOT B)) OR ((NOT A) AND B)

必须重复AB的地方,结果过滤掉结果可能会非常昂贵,这可能就是为什么决定不包含{{1} } SQL中的运算符。