如何使用SQL-intersect-to-work-round-SQL-null

另一个 本周的SQL帖子? 我被书呆子气了:

Image title
数据库同步工具

哦,接受挑战!

因此,假设我们有一个表,其中的列如下所示:


正如所料,这将产生:


真令人兴奋。

现在,我们希望找到所有“匹配”或的行。 显然,这应该产生前两行,对吗?


是的。 现在,规范的解决方案是冗长地写出整个谓词:


那真的很无聊。 当然,我们可以排除第一个常见的谓词:


从性能的角度来看,这当然更好,但是拉斐尔有一个绝妙的主意。 让我们在谓词中使用行值表达式(元组):


不幸的是,这不会产生任何结果,因为在SQL中没有什么是相等的(甚至它自己也不相等)。 上面的查询与这个相同:


哦。

我们有几个。

规范的解决方案将是一个非常蹩脚的(但完全有效的)解决方案。 编码为一些“不可能的”字符串值。 拉斐尔建议道。 很公平。

这是可行的:


我们现在要做的就是永远记住这个术语,它的意思是“但是不要感谢SQL。””

但是等等! 当涉及到。 在三值逻辑中,这意味着,我们从来没有 知道 如果SQL遵守它自己的规则。

进来吧。 与Oracle中的or()一样,这些集合操作也处理两个值。 是的,它们不相等,但也不明显。 随便啦。 记住:事情就是这样

所以,我们可以为拉斐尔的问题写一个时髦的解决方案:


我们创建一个元组的交集,Rafael谓词的左侧,以及谓词右侧的所需值,我们就完成了。

显然不如编写原始谓词那么乏味,对吗?
(我们这次不会考虑性能。
)

猜你喜欢

转载自blog.csdn.net/weixin_49470452/article/details/107507420
今日推荐