2011-01-14 69 views
4

好吧,我有这个字段:code varchar(255)。它包含了我们的出口程序中使用像cross-dbms方法来检查字符串是否是数字

DB84 
DB34 
3567 
3568 

一些值,我需要选择只自动生成的(全数字)字段

WHERE is_numeric(table.code) 

is_numeric()检查code字段只包含积极的数字。

你能提出什么可以在mysql 5.1和oracle 10g下使用吗?

+1

你担心的字符,如`.`和`-`还是你只关心包含所有号码数字? (即正整数)编辑:我不确定它事实上我在想`不像'%[^ 0-9]%'`但看起来像这可能是特定于SQL Server :-( – 2011-01-14 09:28:45

+1

猜测一些标准的SQL -92例如`CAST(代码为AS NUMERIC(x,y))`,其中'x`和`y`的值合适 – onedaywhen 2011-01-14 10:14:14

回答

4

下面是SQL Server,MySQL和Oracle中每一个的三个独立实现。没有人使用(或可以)使用相同的方法,所以似乎没有跨DBMS的方式来做到这一点。 对于MySQL和Oracle,只显示简单整数测试;对于SQL Server,将显示完整的数字测试。

对于SQL Server: 注意isnumeric('。')返回1 ..但它实际上不能转换为float。像“1e6”这样的文本不能直接转换为数字,但可以通过float,然后通过数字。

;with tmp(x) as (
    select 'db01' union all select '1' union all select '1e2' union all 
    select '1234' union all select '' union all select null union all 
    select '1.2e4' union all select '1.e10' union all select '0' union all 
    select '1.2e+4' union all select '1.e-10' union all select '1e--5' union all 
    select '.' union all select '.123' union all select '1.1.23' union all 
    select '-.123' union all select '-1.123' union all select '--1' union all 
    select '---1.1' union all select '+1.123' union all select '++3' union all 
    select '-+1.123' union all select '1 1' union all select '1e1.3' union all 
    select '1.234' union all select 'e4' union all select '+.123' union all 
    select '1-' union all select '-3e-4' union all select '+3e-4' union all 
    select '+3e+4' union all select '-3.2e+4' union all select '1e1e1' union all 
    select '-1e-1-1') 

select x, isnumeric(x), 
    case when x not like '%[^0-9]%' and x >'' then convert(int, x) end as SimpleInt, 
    case 
    when x is null or x = '' then null -- blanks 
    when x like '%[^0-9e.+-]%' then null -- non valid char found 
    when x like 'e%' or x like '%e%[e.]%' then null -- e cannot be first, and cannot be followed by e/. 
    when x like '%e%_%[+-]%' then null -- nothing must come between e and +/- 
    when x='.' or x like '%.%.%' then null -- no more than one decimal, and not the decimal alone 
    when x like '%[^e][+-]%' then null -- no more than one of either +/-, and it must be at the start 
    when x like '%[+-]%[+-]%' and not x like '%[+-]%e[+-]%' then null 
    else convert(float,x) 
    end 
from tmp order by 2, 3 

对于MySQL

create table tmp(x varchar(100)); 
insert into tmp 
    select 'db01' union all select '1' union all select '1e2' union all 
    select '1234' union all select '' union all select null union all 
    select '1.2e4' union all select '1.e10' union all select '0' union all 
    select '1.2e+4' union all select '1.e-10' union all select '1e--5' union all 
    select '.' union all select '.123' union all select '1.1.23' union all 
    select '-.123' union all select '-1.123' union all select '--1' union all 
    select '---1.1' union all select '+1.123' union all select '++3' union all 
    select '-+1.123' union all select '1 1' union all select '1e1.3' union all 
    select '1.234' union all select 'e4' union all select '+.123' union all 
    select '1-' union all select '-3e-4' union all select '+3e-4' union all 
    select '+3e+4' union all select '-3.2e+4' union all select '1e1e1' union all 
    select '-1e-1-1'; 

select x, 
    case when x not regexp('[^0-9]') then x*1 end as SimpleInt 
from tmp order by 2 

对于Oracle

case when REGEXP_LIKE(col, '[^0-9]') then col*1 end 
相关问题