sql >> Database >  >> RDS >> Mysql

cross-dbms manier om te controleren of string numeriek is

Hieronder staan ​​drie afzonderlijke implementaties voor elk van SQL Server, MySQL en Oracle. Geen enkele gebruikt (of kan) dezelfde aanpak, dus er lijkt geen cross-DBMS-manier te zijn om dit te doen. Voor MySQL en Oracle wordt alleen de eenvoudige integer-test getoond; voor SQL Server wordt de volledige numerieke test getoond.

Voor SQL Server:merk op dat isnumeric('.') 1 teruggeeft, maar het kan niet echt worden geconverteerd naar float. Sommige tekst, zoals '1e6', kan niet rechtstreeks in numeriek worden omgezet, maar je kunt wel door float gaan en dan numeriek.

;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

Voor 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

Voor Oracle

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



  1. Beste tool voor het synchroniseren van MySQL-databases

  2. standaard datumnotatie wijzigen laravel sql-query

  3. Grootte van MySQL-schema

  4. Meer informatie over machtigingen op MySQL-tabelniveau