Oracle判断是否为数字或数字型字符串

需求:

如果字段值不是数字或者数字型字符串,把该字段值update成''

1.函数法(不能批量,舍弃):

[sql]
  1. create   or   replace   function   isNumber(p_in   varchar2)   return   boolean   as  
  2.         i   number;  
  3. begin  
  4.         i:=to_number(p_in);  
  5.         return   true;  
  6. exception        
  7.         when   others   then    
  8.               return   false;  
  9. end   ;  

但是这个好像只能一个个判断,不能批量。

2.

[sql]
  1. SQL> select   nvl2(translate('333', '\1234567890 ', '\'), 'is   characters ', 'is   number ')   from   dual; 
  2.  
  3. NVL2(TRANSLATE('333','\1234567 
  4. ------------------------------  
  5. is   number 
  6.  
  7. SQL> select   nvl2(translate(333, '\1234567890 ', '\'), 'is   characters', 'is   number')   from   dual; 
  8.  
  9. NVL2(TRANSLATE(333,'\123456789 
  10. ------------------------------  
  11. is   number 
  12.  
  13. SQL> select   nvl2(translate('aaaaa', '\1234567890 ', '\'), 'is   characters', 'is   number')   from   dual; 
  14.  
  15. NVL2(TRANSLATE('AAAAA','\12345 
  16. ------------------------------  
  17. is   characters 
  18.  
  19. SQL>  

3.据说要批量,可以这样先查出来,没有试过:

[sql]
  1. select   decode(nvl2(translate(column, '\1234567890 ', '\'), '0', '1') ,'1',column,'')  from   dual; 

我写的:

[sql]
  1. Update T_87_Mtbuf Set SpCode='' Where  nvl2(translate(SpCode, '\1234567890 ', '\'), 'is   characters', 'is   number ')='is   characters'; 

SELECT PLL.LINE_LOCATION_ID

FROM PO_LINE_LOCATIONS_V PLL

WHERE 1=1

AND LTRIM(PLL.LINE_LOCATION_ID,'\1234567890') IS NULL

--AND TRANSLATE(PLL.LINE_LOCATION_ID, '\1234567890 ', '\') IS NULL

补充一点:

to_number(...)中只能接受数字如122或数字型字符串'122',接受'aaa'会报错“无效字符”。

你可能感兴趣的:(oracle)