Oracle中如何判斷字符串是否全為數字
學習了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html
本文介紹了判斷字符串是否全為數字的4種辦法,另外還介紹了一個translate函數的小技巧,從任意字符串中提取數字(調用2次translate函數)。這個辦法是一個公司同事發現的,用起來很方便,但理解起來稍有點困難。
1、通過ASCII碼判斷是否數字,介於[48, 57]之間,(ascii('0') = 48, ascii('9') = '57')
2、調用cast函數嘗試強制轉換成NUMERIC或NUMBER,不是合法數字串即拋異常
3、調用translate函數,剔除所有[0-9]數字后,看是否為空串
4、調用正則表達式,進行模式匹配(10g版本新加入的功能)
--通過ASCII碼判斷是否數字,介於[48, 57]之間,(ascii('0') = 48, ascii('9') = '57') DECLARE str VARCHAR2(10) := '123a'; val NUMERIC(10); i int; k int; flag BOOLEAN; BEGIN flag := TRUE; for i in 1..10 loop --新密碼是否6位數字 k := ascii(substr(str, i, 1)); if k < 48 or k > 57 THEN flag := FALSE; end if; end LOOP; IF flag = true THEN dbms_output.put_line(str || '是[0-9]的數字序列'); ELSE dbms_output.put_line(str || '不是[0-9]的數字序列'); END IF; END; -- 調用cast函數嘗試強制轉換成NUMERIC或NUMBER,不是合法數字串即拋異常 DECLARE str VARCHAR2(10) := '123'; val NUMERIC(10); BEGIN val := CAST(str AS NUMERIC); dbms_output.put_line(str || '是[0-9]的數字序列'); EXCEPTION WHEN value_error THEN -- 字符串轉實數錯誤 --dbms_output.put_line(SQLCODE || ', ' || SQLERRM); dbms_output.put_line(str || '不是[0-9]的數字序列'); END; --調用translate函數,剔除所有[0-9]數字后,看是否為空串 DECLARE str VARCHAR2(10) := '123abc'; BEGIN IF replace(translate(str, '0123456789', '0'), '0', '') IS NULL THEN dbms_output.put_line(str || '是[0-9]的數字序列'); ELSE dbms_output.put_line(str || '不是[0-9]的數字序列'); END IF; END; --調用正則表達式,進行模式匹配(10g版本新加入的功能) SELECT * FROM dual WHERE regexp_like('1234', '^[[:digit:]]+$'); --從任意字符串中提取數字串(調用2次translate函數)。 --假定初始串為str。首先將str中數字全部替換為空格,輸出記為str2; --其次,對每個在str中出現的任意str2串中字符,如果是str2的首字符則替換為空格,其它字符則全部剔除 DECLARE --str VARCHAR2(100) := ' 護照01浙江2 3昆 山4蘇 3'; str VARCHAR2(100) := ' 護照浙江 昆 山蘇 4'; ret VARCHAR2(10); BEGIN ret := TRIM(TRANSLATE(str, trim(TRANSLATE(str, '1234567890', ' ')), ' ')); dbms_output.put_line(ret); END;