【问题标题】:Compare numbers excluding suffix in sql比较sql中不包括后缀的数字
【发布时间】:2011-11-17 14:27:53
【问题描述】:

我的数据库中的 ID 号码在最后 3 个字符中嵌入了一个代码。在比较这些 id 是否相等时,有时可以忽略最后 3 个字符。

12345001 == 12345009 应该是真的。

我通常使用以下 where 子句来做到这一点:

where floor(id1/1000) == floor(id2/1000)

但在我知道 id1 以“基本”形式存储的情况下,最后 3 位数字为零,以下也可以:

where id1 == floor(id2/1000)*1000

使用子字符串也可以。


问:谁能根据经验告诉我这三种方法中哪一种最有效,或者推荐最好(最准确)的方法来分析这三种不同的查询。

谢谢。

【问题讨论】:

  • #winces# 你通常不应该在join 列中包含含义(自然键,是的)。你所描述的听起来像你有另一个表试图打破(基本上是一个category表),其中包含前n个数字作为键,以及最后3个数字的子表。哦,如果你正在做整数数学,你不应该需要 FLOOR() 函数 - 结果应该被截断(至少在 DB2 上,这可能是标准的一部分...... )
  • 感谢@XZero 的建议。关于在 join 列中包含含义,我知道它应该是两列,但它是一个大而旧的应用程序,我认为没有人会花时间在它发生的所有情况下解决这个问题...... :(

标签: sql optimization profiling


【解决方案1】:

通过函数运行任一 id 值将阻止任何索引的使用,并且对整数的简单数学运算将比转换为字符类型然后进行子字符串比较更快。

如果您想完全优化这一点,您可以添加一个计算列来派生 floor(id/1000),然后索引它并在您的 WHERE 子句中使用它。

(另一个供您对 abs(id1-id2)<1000 进行基准测试,但像这样的基本数学变换系列仅对大型数据集具有时间意义)

【讨论】:

  • ABS(id1 - id2) < 1000 不会返回所需的结果(12346001 将等同于 12345699,而不是 OP 想要的)。
猜你喜欢
  • 2019-04-07
  • 2014-05-08
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多