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

时间:2015-03-12 05:30:59

标签: database oracle sorting

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

如果上述方法是好的,或者如果是错误的请求建议采用这种方法的话,那么请求。

DB:Oracle

由于

1 个答案:

答案 0 :(得分:2)

  

如何对表中存储为varchar的IP地址进行排序,我正在尝试对记录进行排序,如果是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密集型操作。