1.前言:通過使用FineBI進行“點地圖”方式來展現(xiàn)數(shù)據(jù)。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供康巴什網(wǎng)站建設(shè)、康巴什做網(wǎng)站、康巴什網(wǎng)站設(shè)計、康巴什網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、康巴什企業(yè)網(wǎng)站模板建站服務(wù),10多年康巴什做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
2.遇到的問題:原始表 經(jīng)緯度 是一個字段保存,比如 xy列 中某行值為“130.111111,33.999999”。
3.解決的方法:通過 xy列 中’,‘逗號并使用函數(shù)substr()和函數(shù)instr() 處理后效果圖和SQL示例如下
4.附注:
substr函數(shù)的用法 :
取得字符串中指定起始位置和長度的字符串 ,默認是從起始位置到結(jié)束的子串。
substr( string, start_position, [ length ] )? ? 即:? substr('目標字符串',開始位置,長度)
instr函數(shù)的用法 :
格式一:instr( string1, string2 )? ?即:? instr(源字符串, 目標字符串),本案例是使用此格式。
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )? ?即:instr(源字符串, 目標字符串, 起始位置, 匹配序號)
解析:string2 的值要在string1中查找,是從start_position給出的數(shù)值(即:位置)開始在string1檢索,檢索第nth_appearance(幾)次出現(xiàn)string2。
instr是一個非常好用的字符串處理函數(shù),幾乎所有的字符串分隔都用到此函數(shù)。
--通過游標遍歷調(diào)用方法拆取存表:
--方法
create or replace function f_test_substr(
prm1 varchar2,??? --地
prm2 varchar2 ,?? --名稱
prm3 varchar2,??? --IP
prm4 varchar2??? --結(jié)果
)
return varchar2
as
v_n int:=0;? --第幾次取
v_l int;? --:截取次數(shù)
v_s varchar2(2000);? --處理拆分字符串
v_s1 varchar2(200);? --本次拆分
v_s2 varchar2(200);? --本次剩余
v_type varchar2(100);? --設(shè)備類型
v_code varchar2(100);? --設(shè)備編號
v_desc varchar2(100);? --設(shè)備描述
v_errmsg varchar2(200);
begin
v_l:=length(prm4)-length(replace(prm4,';',''));
v_s:=prm4||';';
v_s1:=substr(v_s,1,instr(v_s,';',1,1));
v_s2:=replace(v_s,v_s1,'');
while v_n=v_l loop
v_s2:=replace(v_s2,v_s1,'');
v_s1:=substr(v_s1,1,length(v_s1)-1);
v_type:=substr(v_s1,1,instr(v_s1,',',1,1)-1);
v_code:=substr(v_s1,instr(v_s1,',',1,1)+1,instr(v_s1,',',1,2)-instr(v_s1,',',1,1)-1);
v_desc:=substr(v_s1,instr(v_s1,',',1,2)+1,instr(v_s1||',',',',1,3)-instr(v_s1,',',1,2)-1);
insert into t_test_str(a,b,c,d,e,f) values(prm1,prm2,prm3,substr(v_type,instr(v_type,']',1)+1),v_code,v_desc);
v_n:=v_n+1;
v_s1:=substr(v_s2,1,instr(v_s2,';',1,1));
end loop;
commit;
return '成功';
exception
when others then
v_errmsg:=substr(sqlerrm,1,200);
return v_errmsg ;
end;
--存過
create or replace procedure p_test_substr1(o_result out varchar2)
as
v_a varchar2(20);
v_b varchar2(20);
v_c varchar2(20);
v_d varchar2(2000);
v_num int;
cursor c_str is
SELECT * from t_test_substr
;
begin
select count(1) into v_num from t_test_substr;
while v_num0 loop
open c_str;
loop
FETCH c_str INTO
v_a,v_b,v_c,v_d;
EXIT WHEN c_str%NOTFOUND;
o_result:=f_test_substr(v_a,v_b,v_c,v_d);
v_num:=v_num-1;
end loop;
CLOSE c_str;
end loop;
end;
效果見圖:
oracle 中可以用connect by把字符串按都好分割:
比如定義字符串:
pv_no_list :='23,34,45,56';
SELECT DISTINCT REGEXP_SUBSTR (pv_no_list,'[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR (pv_no_list,'[^,]+',1,LEVEL) IS NOT NULL
order by 1
返回結(jié)果:
TOKEN
23
34
45
56
select b,
t.ca,
c.lv,instr(t.ca, ',', 1, c.lv) + 1,
substr(t.ca,
instr(t.ca, ',', 1, c.lv) + 1,
instr(t.ca, ',', 1, c.lv + 1) -
(instr(t.ca, ',', 1, c.lv) + 1)) AS c
from (select b,
',' || c || ',' AS ca,
c,
LENGTH(C),
length(c || ','),
REPLACE(c, ','),
length(REPLACE(c, ',')), --刪除逗號的長度
nvl(length(REPLACE(c, ',')), 0), --空值長度為空,因此要將空值替換為0
length(c || ',') - nvl(length(REPLACE(c, ',')), 0) AS cnt --以逗號分隔的字符串個數(shù),先在原來的長度上加1 計算去除所有逗號后字符串長度,再,拿這個
FROM TEST_A) t,
(select LEVEL lv from dual CONNECT BY LEVEL = 100) c
where c.lv = t.cnt --逗號數(shù)量在100以內(nèi)