簡體   English   中英

如何對在Oracle中存儲為varchar的IP地址進行排序

[英]How to sort IP address stored as a varchar in Oracle

如何排序在表中存儲為varchar的IP地址,我正在嘗試對記錄進行排序,如果我按ORDER BY column_name asc排序。 我得到排序后的值,但我不知道這是否是對存儲為varchar的IP地址進行排序的正確方法。

因此,請建議我上述方法是否正確,請建議我可以這樣做。

數據庫:Oracle

謝謝

如何排序在表中存儲為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 
/

由於REGEXP是CPU密集型操作,因此簡單的SUBSTR方法會更快一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM