oracle判断字符串是否为数字

 我来答
1醉梦红颜
2017-04-13
知道答主
回答量:30
采纳率:0%
帮助的人:5.6万
展开全部

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;
匿名用户
2013-12-27
展开全部

可以使用正则表达式的方式来判断。 
REGEXP_LIKE( 字段 , '(^[+-]?\d{0,}\.?\d{0,}$)'
来判断 是否是数字


SQL> SELECT NULL
  2  FROM dual
  3  WHERE REGEXP_LIKE(NULL,'(^[+-]?\d{0,}\.?\d{0,}$)');

未选定行

SQL> 
SQL> SELECT 'Abc' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('Abc','(^[+-]?\d{0,}\.?\d{0,}$)');

未选定行

SQL> 
SQL> SELECT '100' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('100','(^[+-]?\d{0,}\.?\d{0,}$)');

'10
---
100

SQL> 
SQL> SELECT '-100' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('-100','(^[+-]?\d{0,}\.?\d{0,}$)');

'-10
----
-100

SQL> 
SQL> SELECT '.01' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('.01','(^[+-]?\d{0,}\.?\d{0,}$)');

'.0
---
.01

SQL> 
SQL> SELECT '1995-10-1' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('1995-10-1','(^[+-]?\d{0,}\.?\d{0,}$)');

未选定行

SQL> 
SQL> SELECT '1/20/95' 
  2  FROM dual
  3  WHERE REGEXP_LIKE('1/20/95','(^[+-]?\d{0,}\.?\d{0,}$)');

未选定行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
韩福洁
推荐于2017-11-26 · TA获得超过623个赞
知道小有建树答主
回答量:129
采纳率:100%
帮助的人:62.7万
展开全部
用正则表达式:

ORACLE查出列为纯数字的值:
SELECT* FROM DUAL WHERE LENGTH('LSS12345') = LENGTH(REGEXP_REPLACE('LSS12345', '[^0-9]'))
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式