【发布时间】: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