对于Oracle NUMBER数据类型,LIKE运算符与BETWEEN..AND运算符

时间:2011-12-22 16:04:03

标签: sql oracle

假设 mytable 是一个Oracle表,它有一个名为 id 的字段。 id 的数据类型为NUMBER(8)。比较以下查询:

select * from mytable where id like '715%'

select * from mytable where id between 71500000 and 71599999

我认为第二个更有效率,因为我认为“数字比较”需要的数量少于汇总语言指令而不是“字符串比较”。我需要确认或更正。请确认/更正并抛出与任一运营商相关的任何进一步评论。

更新:我忘了提及一条重要信息。在这种情况下, id 必须是8位数字。

5 个答案:

答案 0 :(得分:7)

似乎第二个查询的执行计划更有效。

第一个查询是对id进行全表扫描,而第二个查询不是。

我的测试数据:

第一次查询的执行计划:

enter image description here

第二次查询的执行计划:

enter image description here

答案 1 :(得分:7)

如果您只想要71500000和71599999之间的值,那么第二个更有效率。第一个也将返回7150-7159,71500-71599等之间的值,依此类推。您可能需要筛选不必要的结果,或者编写另外几行代码来过滤掉其余部分。对于您似乎想要做的事情,第二种选择肯定更有效。

答案 2 :(得分:1)

我不喜欢将LIKE与数字列一起使用的想法。 此外,它可能无法提供您正在寻找的结果。 如果您的值为715000000,则它将显示在查询结果中,即使它大于71599999。

另外,我原则上不喜欢。 如果事物介于两个其他事物之间,则不应包括其他两个事物。但这只是个人的烦恼。 我更喜欢使用> =和< =这样可以避免在阅读查询时出现混淆。此外,有时我必须将查询更改为类似> = a和< C。如果我开始使用between运算符,当我不想包容时,我将不得不重写它。

HARV

答案 3 :(得分:0)

除了提出的其他要点之外,以你建议的方式使用LIKE会导致Oracle不使用ID列上的任何索引,因为数据从数字隐式转换为字符,从而导致全表扫描使用BETWEEN时使用LIKE vs.和索引范围扫描。当然,假设你有一个ID索引。但是,即使您不这样做,Oracle也必须对它在LIKE情况下扫描的每个值进行类型转换,而在另一个情况下则不必这样做。

答案 4 :(得分:0)

你可以使用数学函数,否则你必须使用to_char函数来使用,但它会导致性能问题。

从mytable中选择*,其中floor(id / 100000)= 715 要么 select * from mytable where floor(id / 100000)= TO_NUMBER('715')//这是参数