T-SQL XOR 运算符
Posted
技术标签:
【中文标题】T-SQL XOR 运算符【英文标题】:T-SQL XOR Operator 【发布时间】:2011-07-21 15:54:25 【问题描述】:SQL Server (T-SQL) 中是否有 XOR 运算符或等效函数?
【问题讨论】:
我想我试图在可为空的 varchar 列上使用。示例:WHERE(注为空)^(ID 为空)。我收到“'^' 附近的语法不正确” ***.com/questions/6007052/… 请注意,Microsoft SQL 区分用于组成位(即 1 和 0)的 (1) 位运算符(如 and |、&、^link)整数值,以及在 WHERE 子句或 CASE 语句等中使用的 (2) 逻辑布尔运算符(即真假)。和逻辑值相同,即 1 = true,0 = false)。您似乎在询问逻辑运算符,因为您的评论提到了“WHERE”。 据我所知,即使是 SQL 2017 也没有逻辑 XOR 运算符,因此您可以使用 (A OR B) AND NOT (A AND B) 或 (A AND NOT B)或(B而不是A)。好的,现在再慢慢读一遍哈哈 :) 这一切都不是假的 如果 SQL Server 将布尔值作为第一类类型,您可以通过与=
比较来对它们进行独占或处理,但可惜没有。
【参考方案1】:
是^
http://msdn.microsoft.com/en-us/library/ms190277.aspx
另请参阅页面中间的一些代码How to flip a bit in SQL Server by using the Bitwise NOT operator
【讨论】:
打败我。注意:在 SQL Server 2005+ 中可用。另请注意:这是按位运算符,而不是逻辑运算符。 2000年可用msdn.microsoft.com/en-us/library/aa276869(SQL.80).aspx 这并没有回答原来的问题。是的,它确实回答了它是如何被问到的问题,但是如果您阅读 cmets,第一条评论会问“为什么?”因为有两种非常不同的异或。一种是按位异或。另一个是逻辑异或。这个问题并不清楚他问的是哪一个。但评论询问他需要哪个,而他真正需要的不是按位异或,即“^”。因此,这个答案不能解决所要求的问题。【参考方案2】:xor 运算符是^
例如:SELECT A ^ B
其中 A 和 B 是整数类别数据类型。
【讨论】:
那没有通过语法验证: 这没有回答原来的问题。是的,它确实回答了它是如何被问到的问题,但是如果你阅读 cmets,第一条评论会问“为什么?”因为有两种非常不同的异或。一种是按位异或。另一个是逻辑异或。这个问题并不清楚他问的是哪一个。但评论询问他需要哪个,他真正需要的不是按位异或,即“^”。因此,这个答案不能解决所要求的问题。 问题的 cmets 澄清说他不需要整数的异或,这是“按位”异或。真正的问题是逻辑异或,而不是按位异或,就像WHERE (Note is null) ^ (ID is null)
一样使用。请注意,这些不是整数 XOR 操作。
@ShawnKovac 感谢您的澄清,但您应该注意到我在 6 年前发布了这个答案,在 OP 清除它之前几分钟,当时还没有更好的答案 - 并且我也不认为用 OP 正在寻找的答案以外的答案来回答这个问题是错误的,只要它对搜索这个问题的人有用,因为他们可能正在寻找这个解决方案。
@ShawnKovac 可能值得编辑问题而不是对此答案发表评论【参考方案3】:
有一个按位异或运算符 - 插入符号 (^),即 for:
SELECT 170 ^ 75
结果是 225。
对于逻辑异或,使用 ANY 关键字和 NOT ALL,即
WHERE 5 > ANY (SELECT foo) AND NOT (5 > ALL (SELECT foo))
【讨论】:
您能否更详细地解释第二个示例中发生的情况?其中 5 大于 foo 列中的任何值,但不大于 foo 列中的所有值。是这样读的吗? 是的,你没看错。如果满足一个或多个条件,则 XOR 为真,但如果满足零个或所有条件,则为假。我们可以使用 ANY 来查看集合中的任何一个或多个值是否满足条件。它的 NOT ... ALL 部分确保表达式在满足所有条件时返回 false。 呵呵,很有意思。我还没有真正处理过的 T-SQL 的一部分。 我真的不明白这如何回答问题,正如他对问题的评论中的示例所阐明的那样。 请注意,来自 HarveyFrench 的链接特定于 SQL 2014 及更高版本。此外,它是相关的,因为它适用于 OP 似乎要求的按位运算(OP 使用“^”,这是一个按位运算符。)但是,为了帮助其他人,我想指出非在 SQL 2016 之前,按位 XOR 将不可用。【参考方案4】:使用布尔代数,很容易证明:
A xor B = (not A and B) or (A and not B)
A B | f = notA and B | g = A and notB | f or g | A xor B
----+----------------+----------------+--------+--------
0 0 | 0 | 0 | 0 | 0
0 1 | 1 | 0 | 1 | 1
1 0 | 0 | 1 | 1 | 1
1 1 | 0 | 0 | 0 | 0
【讨论】:
这救了我的命,谢谢! (TinyTDS on rails,真让人头疼) 如果你的条件很长,这是不合适的。 如果你有 5 个字段要异或,祝你好运!【参考方案5】:仅限 MS SQL 的缩写形式(自 SQL Server 2012 起):
1=iif( a=b ,1,0)^iif( c=d ,1,0)
【讨论】:
这很可爱。我会评论它,除非它是我店里常见的捷径。我很好奇查询优化器如何处理它与@shawn-kovac 的更明确的答案。但没有足够的好奇心停下来测试它。 这应该是最好的答案,因为 a=b 和 c=d 只被调用一次。这在表达式很昂贵的情况下很重要。该问题询问有关 XOR 作用于逻辑表达式的问题。 请注意,这与 null 值有不同的行为。如果其中一个值为 null,则结果可能与“(a = b and c d) 或 (a b and c = d)”不同。【参考方案6】:正如您在 Spacemoses 的评论中所阐明的,您举了一个例子:WHERE(注意为空)^(ID 为空)。我不明白您为什么选择接受此处给出的任何答案作为回答。如果我需要一个异或,我想我必须使用 AND/OR 等效逻辑:
WHERE (Note is null and ID is not null) OR (Note is not null and ID is null)
相当于:
WHERE (Note is null) XOR (ID is null)
当“异或”不可用时。
【讨论】:
【参考方案7】:来自您的评论:
示例:WHERE(注为空)^(ID为空)
你可以试试:
where
(case when Note is null then 1 else 0 end)
<>(case when ID is null then 1 else 0 end)
【讨论】:
【参考方案8】:<>
通常可以很好地替代 XOR,只要它可以应用于布尔值。
【讨论】:
只有在使用 CASE 表达式时才会如此。示例:CASE WHEN A B THEN 1 ELSE 0 END以上是关于T-SQL XOR 运算符的主要内容,如果未能解决你的问题,请参考以下文章
Python算术运算符赋值运算符关系运算符逻辑运算符条件运算符(三元运算符)