【问题标题】:PL SQL - Multiple column equalityPL SQL - 多列相等
【发布时间】:2016-06-10 04:06:16
【问题描述】:

我正在尝试评估多个列以节省一些击键次数(当然,在这一点上,搜索的时间和精力早已否定了我将获得的任何“好处”),而不是多次不同的比较。

基本上,我有:

WHERE column1 = column2
AND column2 = column3

想要

WHERE column1 = column2 = column3

我发现了另一篇与之相关的文章: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

【问题讨论】:

  • 一些数据库支持这种语法,但它非常不标准。 OR 版本是要走的路。
  • @GordonLinoff,你不是说AND吗?

标签: sql oracle select where-clause equality


【解决方案1】:

一个可能的技巧是利用 leastgreatest 函数 - 如果值列表的最大值和最小值相等,则意味着所有值都相等:

LEAST(col1, col2, col3) = GREATEST(col1, col2, col3)

我不确定它是否会在三列列表中保存任何击键,但如果您有很多列,它可以保存一些字符。请注意,此解决方案隐含地假定所有值都不是 null,但您的原始解决方案也是如此,所以应该没问题。

【讨论】:

  • 这适用于非数字项目吗?比如名字/地址/你有什么?但除此之外,谢谢你的想法!
  • @goodguy5 是的,leastgreatest 应该适用于任何排序类型(例如字符类型、日期等)
  • @Mureinik col1 = col2 AND col2 = col3 有 27 个字符,而 LEAST(col1, col2, col3) = GREATEST(col1, col2, col3) 有 52 个字符,所以我怀疑这是否会节省任何击键
  • 忽略 null 值并假设所有列都是相同的数据类型,这应该可以工作。但除非您要在这些条件下创建基于函数的索引,否则查询性能会受到影响。
  • 继续并将其标记为答案,尽管正如@kordirko 提到的那样,我认为它实际上并没有节省任何击键,但它已经足够接近了。哦,好吧...
【解决方案2】:

用途:

x=all(y,z)

而不是

x=y and y=z

以上节省了 1 次击键(1/11 = 9% - 不多)。

如果列名更长,则节省更多:

这是 35 个字符长:

column1=column2 AND column2=column3

虽然这个只有 28 岁

 column1=ALL(column2,column3)

但是对于这个(95 个字符):

column1=column2 AND column2=column3 AND column3=column4 
AND column4=column5 AND column5=column6

您将获得 43/95 = 近 50% 的节省

column1=all(column2,column3,column4,column5,column6)

ALL 运算符是 ANSII SQL 的一部分,大多数数据库(Mysql、Postgresql、SQLServer 等)都支持它。
http://www.w3resource.com/sql/special-operators/sql_all.php


一个简单的测试用例说明它是如何工作的:

create table t( x int, y int, z int );

insert all 
into t values( 1,1,1)
into t values(1,2,2)
into t values(1,1,2)
into t values(1,2,1)
select 1 from dual;

select *
from t
where x = all(y,z);

        X          Y          Z
---------- ---------- ----------
        1          1          1 

【讨论】:

  • 我很高兴明天在工作中尝试一下。如果成功,我会将此答案标记为正确。
  • 效果很好!太感谢了。我很高兴向我所有的 SQL“朋友”展示这一点。不过,我确实有一个问题:它是否会对性能产生任何明显的影响?我的查询 SEEMED 较慢,但我没有对数据集进行任何明显的测试。 (无需分析,如果你不知道,你已经做得够多了;))
猜你喜欢
  • 2019-08-12
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多