另一个 本周的SQL帖子? 我被书呆子气了:
哦,接受挑战!
因此,假设我们有一个表,其中的列如下所示:
正如所料,这将产生:
真令人兴奋。
现在,我们希望找到所有“匹配”或的行。 显然,这应该产生前两行,对吗?
是的。 现在,规范的解决方案是冗长地写出整个谓词:
那真的很无聊。 当然,我们可以排除第一个常见的谓词:
从性能的角度来看,这当然更好,但是拉斐尔有一个绝妙的主意。 让我们在谓词中使用行值表达式(元组):
不幸的是,这不会产生任何结果,因为在SQL中没有什么是相等的(甚至它自己也不相等)。 上面的查询与这个相同:
哦。
我们有几个。
规范的解决方案将是一个非常蹩脚的(但完全有效的)解决方案。 编码为一些“不可能的”字符串值。 拉斐尔建议道。 很公平。
这是可行的:
我们现在要做的就是永远记住这个术语,它的意思是“但是不要感谢SQL。””
但是等等! 当涉及到。 在三值逻辑中,这意味着,我们从来没有 知道 如果SQL遵守它自己的规则。
进来吧。 与Oracle中的or()一样,这些集合操作也处理两个值。 是的,它们不相等,但也不明显。 随便啦。 记住:事情就是这样
所以,我们可以为拉斐尔的问题写一个时髦的解决方案:
我们创建一个元组的交集,Rafael谓词的左侧,以及谓词右侧的所需值,我们就完成了。
显然不如编写原始谓词那么乏味,对吗?
(我们这次不会考虑性能。
)