database - 如何对在 Oracle 中存储为 varchar 的 IP 地址进行排序

标签 database oracle sorting

如何对表中存储为 varchar 的 IP 地址进行排序,我正在尝试对记录进行排序,如果我按 column_name asc 进行排序。我得到了排序后的值,但我不知道这是否是对存储为 varchar 的 IP 地址进行排序的正确方法。

所以请建议我,如果上述方法是好的,或者如果它是错误的,请建议我这样做的方法。

数据库:甲骨文

谢谢

最佳答案

How to sort IP address stored as a varchar in table, I am trying to sort the records and if i ORDER BY column_name asc.

您正在按字符串而不是数字排序。

您可以将IP 地址 存储到4 个不同的NUMBER 列。现在,您只有一个 IP 地址列,所有 4 个字段都放在一起,剩下的就是分隔字符串操作。

你可以通过两种方式做到这一点:

<强>1。 SUBSTR 和 TO_NUMBER

例如,

SELECT IP
FROM table_name
ORDER BY to_number(SUBSTR(IP,1,instr(IP,'.')-1)) ,
  to_number(SUBSTR(IP,instr(IP,'.')         +1, instr(IP,'.',1,2) - instr(IP,'.') - 1)),
  to_number(SUBSTR(IP,instr(IP,'.',1,2)     +1, instr(IP,'.',1,3) - instr(IP,'.',1,2) - 1)),
  to_number(SUBSTR(IP,instr(IP,'.',1,3)     +1))
/

<强>2。 REGEXP_SUBSTR 和 TO_NUMBER

例如,

SELECT IP
FROM table_name
ORDER BY TO_NUMBER (REGEXP_SUBSTR (IP, '[[:digit:]]+', 1, 1)) ASC ,
  TO_NUMBER (REGEXP_SUBSTR (IP, '[[:digit:]]+', 1, 2)) ASC ,
  TO_NUMBER (REGEXP_SUBSTR (IP, '[[:digit:]]+', 1, 3)) ASC ,
  TO_NUMBER (REGEXP_SUBSTR (IP, '[[:digit:]]+', 1, 4)) ASC 
/

简单的 SUBSTR 方法会快一点,因为 REGEXP 是 CPU 密集型操作。

关于database - 如何对在 Oracle 中存储为 varchar 的 IP 地址进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29002519/

相关文章:

database - MongoDB:在没有 MapReduce 的情况下对对象中的值求和

c++ - 事务中的sqlite3_step(stmt)失败,错误5,而没有调用我的忙处理程序

c# - 如何为 EF 6、Oracle DB、 Controller 脚手架调试和修复 'Exception has been thrown by the target of an invocation'

jquery - 在 jQuery 中订购 <UL>/<OL> 最简单的方法是什么?

java - ConcurrentSkipListSet 和重新排序 (java)

sql - 具有存储库模式的抽象

mysql - Microsoft SQL 到 MySQL 触发器

java - 执行删除和更新时停止

sql - Oracle SQL打印特定列时间的行

ruby-on-rails - 在 Rails 中,如何检索模型中的 10 个最新条目?