oracle怎么在字符字段中查出只包含数字的数据

假设有一个表table里,包含一个字段check,是字符型的,这个字段里有的包含数字,有的不包含,我只要把包含数字的数据找出来,不会写SQL,麻烦大侠帮忙,谢谢!... 假设有一个表table里,包含一个字段check,是字符型的,这个字段里有的包含数字,有的不包含,我只要把包含数字的数据找出来,不会写SQL,麻烦大侠帮忙,谢谢! 展开
 我来答
eridroid
2013-11-26 · TA获得超过128个赞
知道答主
回答量:74
采纳率:0%
帮助的人:72.7万
展开全部

如果你的条件不允许你写PLSQL函数的话,就用正则表达式,如下:


SELECT *
  FROM TABLE
 WHERE REGEXP_SUBSTR(CHECK, '^[0-9\.\-]\d*\.{0,1}\d+$') IS NOT NULL;
追问
谢谢你提供的方法,能查出只有数字的项来,可是如果数字是1或9,就没有查出来。
追答

试试这个吧:

SELECT *
  FROM TABLE
 WHERE REGEXP_SUBSTR(CHECK, '^[0-9\.\-]\d*\.{0,1}\d*$') IS NOT NULL;
good_007_2000
推荐于2017-11-26 · TA获得超过223个赞
知道答主
回答量:144
采纳率:0%
帮助的人:116万
展开全部
你应该希望提取的字段只要含有数字就提出,剔除空和不含数字的字符串。

select * from table where regexp_substr(check,'[0-9]+') is not null
追问
太感谢啦!
麻烦再问一下,这个字段有些项含有数字,但也有其它字符,但我只想对其中的数字求和,这样可以吗?怎么写SQL,谢谢!
追答
 
declare

  v_length  number default 0;  ---记录字符串长度
  t_sum    number default 0;  ---记录字符串中数字之和
  t_num    number default 0;  ---记录每次取到数字时的值
  t_is_num number default 0; ---判断取到的值是否数字
  v_str    TMP_XYX26.T2%type;  ---取出的值

  ---获取含有数字字符串所有记录
  cursor t_cur is
    select t2 from TMP_XYX26 where regexp_substr(t2, '[0-9]+') is not null;

begin
  open t_cur;
  loop
    fetch t_cur
      into v_str;
    exit when t_cur%notfound;
    t_sum := 0;
    select length(v_str) into v_length from dual;
    for i in 1 .. v_length loop
    
      select ascii(substr(v_str, i, 1)) into t_is_num from dual; ---根据ASCII码判断取出的字符是否为数字,48到57分别 表示0-9
    
      if t_is_num between 48 and 57 then
      
        select substr(v_str, i, 1) into t_num from dual;
        t_sum := t_sum + t_num;
      
      else
        null;
      end if;
    
    end loop;
    ---打印结果
    dbms_output.put_line('字符串' || ' ' || v_str || ' ' || '对应数字之和' || t_sum);
  end loop;
  close t_cur;
end;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bolibei玻璃
2018-03-30 · TA获得超过1.3万个赞
知道小有建树答主
回答量:153
采纳率:95%
帮助的人:48.8万
展开全部

declare   v_length  number default 0;  

t_sum    number default 0; 

t_num    number default 0;  

t_is_num number default 0;  

v_str    TMP_XYX26.T2%type;   

cursor t_cur is select t2 from TMP_XYX26 where regexp_substr(t2, '[0-9]+') is not null; 

begin  open t_cur;  

loop    fetch t_cur      into v_str;    

exit when t_cur%notfound;    t_sum := 0;    

select length(v_str) into v_length from dual;    

for i in 1 .. v_length loop    select ascii(substr(v_str, i, 1)) into t_is_num from dual; 

if t_is_num between 48 and 57 then   select substr(v_str, i, 1) into t_num from dual;       

t_sum := t_sum + t_num;            

else null;      

end if;         

end loop;      

dbms_output.put_line;

end loop; 

close t_cur;

end;

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吾儿梁龙庆
2013-11-26 · 超过13用户采纳过TA的回答
知道答主
回答量:26
采纳率:0%
帮助的人:24.1万
展开全部
select * from tableName where check<> regexp_replace(check,'[^0-9]');

目前我就想到这个方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mislloloe
2013-11-27 · TA获得超过508个赞
知道小有建树答主
回答量:327
采纳率:0%
帮助的人:209万
展开全部
正则表达式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式