我有一张表格如下
表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?
答案 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)
答案 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)
必须重复A
和B
的地方,结果过滤掉结果可能会非常昂贵,这可能就是为什么决定不包含{{1} } SQL中的运算符。