如何使用SQL查詢IP位址所屬IP段

2021-08-30 18:42:44 字數 2722 閱讀 3828

最近有個朋友說他要做的人員註冊量的統計,有兩張表,一張是使用者登錄檔,一張是ip段對應城市表。需要根據使用者註冊時的ip查詢到對應的城市,從而知道該城市有多少人註冊。

其實沒什麼,關鍵是ip位址和ip段的匹配問題。

一開始,我使用的是between,結果顯然是不行的。

最後我想到用函式直接將192.168.0.1形式的ip按256進製轉為數字,然後進行between(或者"<"and">")。

其實想到方法,實現就簡單的多了。下面把函式貼上來,有需要的朋友可以偷偷懶 ^_^

1、使用者登錄檔

create table sino_user

(id          number(19),

username    varchar2(255),

update_time timestamp(6),

ip          varchar2(255)

)2、ip位址段表

create table sino_ip

(id       number(19),

ip_begin varchar2(255),

city     varchar2(255),

ip_end   varchar2(255)

)注:這兩張表是我簡化了,千萬別以為是生產庫的表.....

3、建立函式

create or replace function f_ip2number(ip in varchar2) return varchar2 as

v_ip_1 number;

v_ip_2 number;

v_ip_3 number;

v_ip_4 number;

v_result number;

begin

select to_number(substr(ip,1,instr(ip,'.',1,1)-1)),

to_number(substr(ip,instr(ip,'.',1,1)+1,instr(ip,'.',1,2)-instr(ip,'.',1,1)-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,length(ip)-instr(ip,'.',1,3))) into v_ip_1,v_ip_2,v_ip_3,v_ip_4

from dual;

v_result := v_ip_1 * 256*256*256 + v_ip_2 * 256*256 + v_ip_3 * 256 + v_ip_4;

return v_result;

end;

4、查詢的sql

select *

from sino_user t, sino_ip t1

where f_ip2number(t.ip) between f_ip2number(t1.ip_begin) and

f_ip2number(t1.ip_end)

ip                          ip_begin                   ip_end                  city

1 200.220.0.10        200.220.0.1           255.255.255.255        城市5

2 199.168.200.21    192.168.255.255   200.168.105.10          城市4

3 199.168.200.20    192.168.255.255   200.168.105.10          城市4

4 192.168.200.20    192.168.21.1         192.168.225.10          城市3

5 192.168.1.21        192.168.1.1           192.168.1.35              城市2

6 192.168.1.20        192.168.1.1           192.168.1.35              城市2

7 192.168.0.50        192.168.0.1           192.168.0.255            城市1

相信大家都注意到問題在**了,對了,執行效率問題。

解決方法:

方法一、加冗餘字段

在兩個表都加上冗餘字段,統計查詢的時候直接根據冗餘欄位來查詢;

方法二、加函式索引

如sino_user表的ip欄位:create index idx_sino_user_ip on sino_user(f_ip2number(ip));

如果你按照我上面說的建立索引,oracle會報錯的,具體什麼錯我忘了,大概是函式沒有準備好之類的。

這是因為oracle對於自定義函式建索引是有規定的。

回到函式的建立:

create or replace function f_ip2number(ip in varchar2) return varchar2 as

這麼來建立是不能用來加索引的,需要加deterministic

create or replace function f_ip2number(ip in varchar2) return varchar2 deterministic as

ok,現在再來建立索引就ok了。

哈哈,很簡單吧。

IP位址所屬運營商查詢

對於 經營者或網路技術人員來說,經常會碰到要確定乙個特定的ip位址是屬於那家isp的這樣的問題。對於使用unix類系統的使用者來說,這個問題很好解決,只要執行whois ip就可以得到有關的資訊。因為windows系統沒有whois命令,所以對於使用windows系統的使用者來說完成上面的任務就有些...

查詢IP所屬地

做了查詢ip所屬地的程式,將過程記錄如下 1,建立資料庫 得到的是乙個.dat檔案,通過iplook工具轉換成了.txt格式的,然後匯入了access中,最後匯入到ms sqlserver中.ip資料庫有三個字段,startip decimal 18,0 endip decimal 18,0 add...

如何查詢特定IP位址

1.使用mysql內建函式 我試著使用位移位將ip位址值轉換為整數。mysql有執行這些轉換的內建函式。我以前從來沒有聽說過這些活動,所以我想我可以玩一玩。在下面的演示中,我將乙個ip位址字串拖到mysql引擎中,然後使用inet aton 和inet ntoa 兩種方法將ip位址轉換為乙個數字,然...