最近有個朋友說他要做的人員註冊量的統計,有兩張表,一張是使用者登錄檔,一張是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位址轉換為乙個數字,然...