经常看到有人提出这样的需求,判断一个字符串的内容是否是数值。于是写了两种两个判断是否属于NUMBER类型的函数。
发现上一篇文章中,给出的自定义函数的方法确实了对科学技术法的判断。这里将其补充上。
判断是否数字类型:http://yangtingkun.itpub.net/post/468/57289
前两天在看论坛的帖子时发现有人提到了这个问题,随着讨论的深入,我发现了自己实现的第二个函数缺少了对科学技术法的判断。
于是将函数进行了一下修改:
SQL> CREATE OR REPLACE FUNCTION F_IS_NUM1(P_NUM IN VARCHAR2) RETURN VARCHAR2 AS
2 V_NUM_DOT NUMBER DEFAULT 0;
3 V_E_POSITION NUMBER DEFAULT 0;
4 BEGIN
5 IF P_NUM IS NULL THEN
6 RETURN NULL;
7 END IF;
8 FOR I IN 1..LENGTH(P_NUM) LOOP
9 CASE SUBSTR(P_NUM, I, 1)
10 WHEN '0' THEN NULL;
11 WHEN '1' THEN NULL;
12 WHEN '2' THEN NULL;
13 WHEN '3' THEN NULL;
14 WHEN '4' THEN NULL;
15 WHEN '5' THEN NULL;
16 WHEN '6' THEN NULL;
17 WHEN '7' THEN NULL;
18 WHEN '8' THEN NULL;
19 WHEN '9' THEN NULL;
20 WHEN 'E' THEN
21 IF I = 1 OR I = LENGTH(P_NUM) THEN
22 RETURN 'N';
23 ELSIF V_E_POSITION != 0 THEN
24 RETURN 'N';
25 ELSE
26 V_E_POSITION := I;
27 END IF;
28 WHEN 'e' THEN
29 IF I = 1 OR I = LENGTH(P_NUM) THEN
30 RETURN 'N';
31 ELSIF V_E_POSITION != 0 THEN
32 RETURN 'N';
33 ELSE
34 V_E_POSITION := I;
35 END IF;
36 WHEN '.' THEN
37 IF I > V_E_POSITION AND V_E_POSITION != 0 THEN
38 RETURN 'N';
39 END IF;
40 V_NUM_DOT := V_NUM_DOT 1;
41 IF V_NUM_DOT > 1 THEN
42 RETURN 'N';
43 END IF;
44 WHEN '-' THEN
45 IF I != V_E_POSITION 1 THEN
46 RETURN 'N';
47 END IF;
48 WHEN ' ' THEN
49 IF I != V_E_POSITION 1 THEN
50 RETURN 'N';
51 END IF;
52 ELSE RETURN 'N';
53 END CASE;
54 END LOOP;
55 IF SUBSTR(P_NUM, -1, 1) IN (' ', '-', 'E', 'e') THEN
56 RETURN 'N';
57 ELSE
58 RETURN 'Y';
59 END IF;
60 END;
61 /
函数已创建。
SQL> CREATE TABLE T (NUM_STR VARCHAR2(100));
表已创建。
SQL> INSERT INTO T VALUES ('-5');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2.2342');
已创建 1 行。
SQL> INSERT INTO T VALUES (' 123.1234');
已创建 1 行。
www.ixdba.net
SQL> INSERT INTO T VALUES ('-5-34');
已创建 1 行。
SQL> INSERT INTO T VALUES ('1230234J342');
已创建 1 行。
SQL> INSERT INTO T VALUES ('5.524.2');
已创建 1 行。
SQL> INSERT INTO T VALUES (' 5.23E23');
已创建 1 行。
SQL> INSERT INTO T VALUES ('-0.47e-2');
已创建 1 行。
SQL> INSERT INTO T VALUES ('345E 5');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2E3.5');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2E3E1');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2E');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2-');
已创建 1 行。
SQL> INSERT INTO T VALUES ('2.');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> COL NUM_STR FORMAT A12
SQL> COL IS_NUM FORMAT A6
SQL> SELECT NUM_STR, F_IS_NUM1(NUM_STR) IS_NUM FROM T;
NUM_STR IS_NUM
------------ ------
-5 Y
2.2342 Y
123.1234 Y
-5-34 N
1230234J342 N
5.524.2 N
5.23E23 Y
-0.47e-2 Y
345E 5 Y
2E3.5 N