巧取字串中的數字
最近參與到了公司 渠道考核專案的實施,由於是新加入,對於很多東西都不是很熟悉,這不遇到一個難題,需要從一堆有漢字有英文還有數字的字串裡面把數字取出來,數其中有一個可以利用的規律是數字前一定是冒號 : 而且數字是四位數的 一開始用instr函式和substr函式 來查詢,但是於對一行字串當中有多個冒號的情況未能為力,必須要知道一行當中有多少個冒號,才能取出所有的數字。 一開始想著假設一行不會超過10個,然後用instr查詢十次,找出來的值用substr取出來然再判斷是否可以轉換為number型的,可以轉換的話就是數字就保留下來存放在一個結果表裡面,不能轉換的話就是字元,就給exception掉。 雖然這種方法可行,但是終究不夠嚴謹,假設有超過10個冒號就會丟失資訊。
後來一個同事說 可以用替換函式找到冒號給替換成空值,我恍然大悟,這樣用length函式求出總長度然後再求出REPLACE替換為空值後的長度,相減即可得到冒號的數量,當時精神為之一振,不得不佩服同事的演算法確實很高明,於是按照這個思路很快就完成了一個PL/SQL語句。
附上程式碼,供大家參考:
create or replace
FUNCTION fc_return_numeral(in_char varchar)
RETURN number
AS
out_v number;
in_exp varchar2(4000);
BEGIN
in_exp:=in_char;
select (length(in_exp)-length(replace(in_exp,':',''))) into out_v from dual;
FUNCTION fc_return_numeral(in_char varchar)
RETURN number
AS
out_v number;
in_exp varchar2(4000);
BEGIN
in_exp:=in_char;
select (length(in_exp)-length(replace(in_exp,':',''))) into out_v from dual;
RETURN out_v;
END;
/
declare n number;
v1 number;
vcn1 varchar2(255);
v2 number;
vcn2 varchar2(255);
v3 varchar2(4000);
n_value number;
cursor v is select x.assess_model_id,x.assess_model_name ,y.assess_id,o.assess_name,z.fore_rules_content_lower||z.rules_content_higher||z.fore_rules_content_lower||z.fore_rules_content_higher as m_value
from cs_assess_model x
LEFT JOIN cs_assess_model_rel y ON x.assess_model_id = y.assess_model_id
LEFT JOIN cs_assess o ON y.assess_id = o.assess_id
LEFT JOIN cs_rules z ON y.rules_seq_id = z.seq_id
WHERE x.state IN (1,2)
AND o.assess_type=1
ORDER BY x.assess_model_id,y.assess_id;
begin
open v;
loop
fetch v into v1,vcn1,v2,vcn2,v3;
exit when v%notfound;
select fc_return_numeral(v3) into n from dual;
for i in 1..n loop
select to_number(substr(v3,instr(v3,':',1,i)+1,4)) into n_value from dual;
execute immediate '
insert into test_zyp (ASSESS_MODEL_ID,ASSESS_MODEL_NAME,ASSESS_ID,ASSESS_NAME,EXP_VALUE)
values('||v1||','''||vcn1||''','||v2||','''||vcn2||''','||n_value||')';
commit;
end loop;
end loop;
end;
/
v1 number;
vcn1 varchar2(255);
v2 number;
vcn2 varchar2(255);
v3 varchar2(4000);
n_value number;
cursor v is select x.assess_model_id,x.assess_model_name ,y.assess_id,o.assess_name,z.fore_rules_content_lower||z.rules_content_higher||z.fore_rules_content_lower||z.fore_rules_content_higher as m_value
from cs_assess_model x
LEFT JOIN cs_assess_model_rel y ON x.assess_model_id = y.assess_model_id
LEFT JOIN cs_assess o ON y.assess_id = o.assess_id
LEFT JOIN cs_rules z ON y.rules_seq_id = z.seq_id
WHERE x.state IN (1,2)
AND o.assess_type=1
ORDER BY x.assess_model_id,y.assess_id;
begin
open v;
loop
fetch v into v1,vcn1,v2,vcn2,v3;
exit when v%notfound;
select fc_return_numeral(v3) into n from dual;
for i in 1..n loop
select to_number(substr(v3,instr(v3,':',1,i)+1,4)) into n_value from dual;
execute immediate '
insert into test_zyp (ASSESS_MODEL_ID,ASSESS_MODEL_NAME,ASSESS_ID,ASSESS_NAME,EXP_VALUE)
values('||v1||','''||vcn1||''','||v2||','''||vcn2||''','||n_value||')';
commit;
end loop;
end loop;
end;
/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-712111/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [iOS 取出字串中的數字]iOS字串
- PHP提取字串中的數字PHP字串
- 抽取字串中數字的函式字串函式
- 巧取簡訊中的回覆程式碼
- javascript中將數字轉為字串的方法JavaScript字串
- c++中數字和字串的轉換C++字串
- Awk 字串連線操作(字串轉數字,數字轉字串)字串
- 統計字串中數字個數,並將數字字串形式輸出字串
- 【冰山白皮書】JS中的布林 數字 字串JS字串
- JavaScript刪除字串中的非數字內容JavaScript字串
- PHP技術分享-提取字串中的數字PHP字串
- 提取字串中數字的程式碼例項字串
- C#按字串中的數字排序問題C#字串排序
- ORACLE從字串中過濾出數字~~Oracle字串
- SQL Server 中將字串按數字排序SQLServer字串排序
- C++/C:數字轉成字串, 字串轉成數字C++字串
- HOME: Count Digits —— 計算字串中數字個數Git字串
- Python正規表示式匹配字串中的數字Python字串
- Go 中數字轉換字串的正確姿勢Go字串
- mssql sqlserver 從指定字串中獲取數字的方法SQLServer字串
- 【.Net】從字串陣列中尋找數字的元素字串陣列
- python字串的分段美化-數字中間用_或者,Python字串
- Python中如何將字串變成數字?Python字串
- 字串轉數字的問題字串
- 檢測字串中數字和字母的數量程式碼例項字串
- 數字與字串5.5字串
- PHP字串數字相加PHP字串
- 字串分割 提取數字字串
- 去除字串中的漢字function字串Function
- 字串和數字的相互轉換字串
- SQL字串的數字部分遞增SQL字串
- mysql 字串和數字比,字串會隱式轉換為數字0MySql字串
- 數字格式字串轉數字保留後面0字串
- 字串或數字反轉字串
- JavaScript字串轉換數字JavaScript字串
- Golang字串解析成數字Golang字串
- 字串型別數字order by字串型別
- 從字串中提取數字字串