CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

请问oracle中如何判断某字段的值为数值而不是其他字母?

楼主darkwanderer(一个人到处走)2005-09-16 14:05:41 在 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

相关问题

  • Oracle中,表的字段名是不是只能用大写字母?
  • 数值型字段的格式化
  • 熟悉Oracle编程的朋友请进,150分相送。如何向oracle某一数值型字段插入空值(NULL)
  • Oracle中的自增字段
  • Oracle的TimeStamp型字段?
  • 在Oracle中写BLOB字段
  • oracle日期字段问题
  • 怎样将一个数值型字段union到一个文本型字段中
  • 关于数值型字段的小数位问题。
  • 字符型转化为数值型(数据表字段)!

关键词

  • 数值
  • 字段
  • 字母
  • 判断
  • trg
  • translate
  • column1
  • 值
  • 换成
  • exit

得分解答快速导航

  • 帖主:darkwanderer
  • sasacat
  • waterfirer
  • qiaozhiwei

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo