oracle数据库中字段转换,找出一列中不可转为数字的行

有一列数字,数据库中存储方式为varchar2,形式类似为‘2456.00’,‘456.15’将他们转换为数字的过程中,因为有些数据不规范,类似‘20.20.20’或者‘... 有一列数字,数据库中存储方式为varchar2 ,形式类似为‘2456.00’,‘456.15’将他们转换为数字的过程中,因为有些数据不规范,类似‘20.20.20’或者‘20万’或‘2O’等,导致无法正常的转换,请问怎么找到这些不规范的字段。 展开
 我来答
198901245631
推荐于2018-04-06 · TA获得超过3.5万个赞
知道大有可为答主
回答量:9037
采纳率:92%
帮助的人:1742万
展开全部

oracle中没有现成的方法判断数据是否是数字类型的的,可以通过function来实现:

CREATE OR REPLACE FUNCTION isnum (str IN VARCHAR2)
   RETURN NUMBER
IS
   v_str VARCHAR2 (1000);
BEGIN
   IF str IS NULL
   THEN
      RETURN 0;
   ELSE
      v_str := TRANSLATE (str, '.0123456789', '.');
      IF v_str = '.' OR v_str = '+.' OR v_str = '-.' OR v_str IS NULL
      THEN
         RETURN 1;
      ELSE
         RETURN 0;
      END IF;
   END IF;
END isnum;

扩展判断一列的数据类型是不是数值类型:

select * from 表 where not regexp_like(列名,'^[[:digit:]]+$');.

chen_hongyang
推荐于2016-11-15 · TA获得超过5447个赞
知道大有可为答主
回答量:2790
采纳率:91%
帮助的人:872万
展开全部
新建一个函数,用来判断是否数字
Oracle 中 isnumeric 的三种实现
在 oracle 中没有现成的判断是否为数字函数,下面就用三种方法来实现:  
1. 利用 to_number
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
v_str FLOAT;
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
BEGIN
SELECT TO_NUMBER (str)
INTO v_str
FROM DUAL;
EXCEPTION
WHEN INVALID_NUMBER
THEN
RETURN 0;
END;
RETURN 1;
END IF;
END isnumeric;
2. 利用 regexp_like
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
IF regexp_like (str, '^(-{0,1}+{0,1})[0-9]+(.{0,1}[0-9]+)$')
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END isnumeric;
3. 利用 TRANSLATE
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
v_str VARCHAR2 (1000);
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
v_str := TRANSLATE (str, '.0123456789', '.');
IF v_str = '.' OR v_str = '+.' OR v_str = '-.' OR v_str IS NULL
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END isnumeric;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjy198518
2013-08-19 · TA获得超过867个赞
知道小有建树答主
回答量:777
采纳率:80%
帮助的人:569万
展开全部
其实很简单的,只要判断字段中是否包含两个及两个以上的点,转换的时候将其排除就行了
具体写法是
select …… from tbname t
where t.col not like '%.%.%'

我写了个例子做了下验证
select * from
(select '20.20.20' col from dual
union all
select '20.20' col from dual
union all
select '10.20.20.20' col from dual
union all
select '20.20.20.20.29' col from dual
)
where col like '%.%.%'
结果
20.20.20
10.20.20.20
20.20.20.20.29
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圣鸾OJ
2015-10-06 · TA获得超过1629个赞
知道小有建树答主
回答量:1136
采纳率:96%
帮助的人:114万
展开全部
新建一个函数,用来判断是否数字
Oracle 中 isnumeric 的三种实现
在 oracle 中没有现成的判断是否为数字函数,下面就用三种方法来实现:  
1. 利用 to_number
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
v_str FLOAT;
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
BEGIN
SELECT TO_NUMBER (str)
INTO v_str
FROM DUAL;
EXCEPTION
WHEN INVALID_NUMBER
THEN
RETURN 0;
END;
RETURN 1;
END IF;
END isnumeric;
2. 利用 regexp_like
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
IF regexp_like (str, '^(-{0,1}+{0,1})[0-9]+(.{0,1}[0-9]+)$')
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END isnumeric;
3. 利用 TRANSLATE
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
RETURN NUMBER
IS
v_str VARCHAR2 (1000);
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
v_str := TRANSLATE (str, '.0123456789', '.');
IF v_str = '.' OR v_str = '+.' OR v_str = '-.' OR v_str IS NULL
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END IF;
END isnumeric;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8533056
2013-08-19
知道答主
回答量:25
采纳率:0%
帮助的人:18.2万
展开全部
尝试一下ORDER BY
追问
order by 不行的,因为order by 是按顺序一个个比较字符的。数据量很大,几万条,自己去找不现实。解决这个问题,最好从正则表达式入手,把数据分为两部分,一个是点和数字,另一部分是补集。然后再怎么处理第一部分是难点,现方向是通过存储过程捕获异常处理。还是希望有能力的人能帮忙认真解答下,因为本人水平有限。
追答
既然XX.XX的形式是正确的,这样行不呢:
select * from TABLE where 字段 like %.% and (字段 not like %.%.%)
不过要再考虑一下如何排除类似于 2O.00 这样的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式