请问oracle中如何判断某字段的值为数值而不是其他字母?
问题简单表述如下:
表table_a有6个字段,A,B,C,D,E,F。其中,A,B,C是主键,D是varchar(3)的error code,E是varchar(6)的年月,F是varchar(4)的销售额。D的设置取决于E和F的值,如果E的年月不合法,则将D置为‘001’,如果F的销售额不合法,则将D置为‘002’。
我需要做一个trigger,在table_a中插入或者更新纪录的时候,根据E和F的值,设置D的值。
trigger大致如下:
--------------------------------------------------------
CREATE OR REPLACE Trg_RecordChk
BEFORE INSERT OR UPDATE ON table_a
FOR EACH ROW
BEGIN
IF :NEW.E的月份不在1-12之间 THEN
:NEW.D := '001';
EXIT;
END IF;
IF :NEW.F不是数值 THEN
:NEW.D := '002';
EXIT;
END IF;
END Trg_RecordChk;
------------------------------------
对于E的月份判断,我想可以通过截取字符串的后两位进行判断,但是对于F的判断,我没有找到一个函数可以判断某个字段的值是数值(比如F的值是'100a'而不是'1000').
请教各位达人,oracle中有没有函数可以判断某个值是数值?如果没有的话如何判断一个值是数值而不是其他字母?多谢了。
问题点数:20、回复次数:13Top
1 楼sasacat(傻傻猫)回复于 2005-09-16 14:18:10 得分 2
select * from xxx where translate(column1,'1234567890','') = column1;Top
2 楼waterfirer(水清)回复于 2005-09-16 14:48:13 得分 8
应该是
select * from xxx where translate(column1,'1234567890','$') = column1;
吧。
Top
3 楼qiaozhiwei(乔)回复于 2005-09-16 14:51:51 得分 10
CREATE OR REPLACE Trg_RecordChk
BEFORE INSERT OR UPDATE ON table_a
FOR EACH ROW
BEGIN
IF SUBSTR(:NEW.E,-2,2) NOT BETWEEN '01' AND '12' THEN
:NEW.D := '001';
EXIT;
END IF;
BEGIN
:NEW.F := TO_CHAR(TO_NUMBER(:NEW.F));
EXCEPTION
WHEN OTHERS THEN
:NEW.D := '002';
EXIT;
END;
END Trg_RecordChk;Top
4 楼sasacat(傻傻猫)回复于 2005-09-16 14:52:14 得分 0
你说得对Top
5 楼darkwanderer(一个人到处走)回复于 2005-09-16 16:34:10 得分 0
谢谢大家。
应该是
select * from xxx where translate(column1,'1234567890','$') = column1;
吧。
======================
然后继续对column1进行判断吗?Top
6 楼darkwanderer(一个人到处走)回复于 2005-09-16 16:42:48 得分 0
多谢qiaozhiwei(乔),你的方法我用了,果然很好用,谢谢了。Top
7 楼waterfirer(水清)回复于 2005-09-16 17:03:08 得分 0
然后继续对column1进行判断吗?
------
不是啊,
IF :NEW.F不是数值 THEN
换成
IF :NEW.F<>translate(:NEW.F,'1234567890','$') THEN
就行了Top
8 楼darkwanderer(一个人到处走)回复于 2005-09-21 14:59:24 得分 0
IF :NEW.F不是数值 THEN
换成
IF :NEW.F<>translate(:NEW.F,'1234567890','$') THEN
就行了
==================
如果:NEW.F = ‘2341’,那么translate(:NEW.F,'1234567890','$')=‘$’
如果:NEW.F = ‘23dafd41dfd’,那么translate(:NEW.F,'1234567890','$')=‘$dafd$dfd’
这么判断好像不行吧Top
9 楼darkwanderer(一个人到处走)回复于 2005-09-21 15:03:22 得分 0
是不是可以这样?
IF translate(:NEW.F,'1234567890','$') = ‘$’ THENTop
10 楼darkwanderer(一个人到处走)回复于 2005-09-21 15:05:26 得分 0
对不起,实际编译的时候发现示例中EXIT应该换成RETURN。
exit是跳出loop用的。Top
11 楼xxc1981(asf)回复于 2005-09-21 15:12:20 得分 0
我觉得你的出发点就很奇怪
像这样的判断应当在应用层里面实现啊.Top
12 楼waterfirer(水清)回复于 2005-09-21 15:36:09 得分 0
楼主还是用qiaozhiwei(乔)的方法吧。
我的方法只能判断字母中是否含有数字
Top
13 楼darkwanderer(一个人到处走)回复于 2005-09-21 16:38:51 得分 0
TO:xxc1981(asf)
你说得对,其实这些东西在应用层(比如vb画面)里实现更好,但是项目要求如此,我也没有办法。
况且,多学会一种检验方法总是好事。Top




