sql >> データベース >  >> RDS >> Mysql

文字列が数値であるかどうかを確認するcross-dbmsの方法

    以下は、SQL Server、MySQL、およびOracleのそれぞれに対する3つの個別の実装です。同じアプローチを使用する(または使用できる)ものはないため、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
    



    1. MariaDBでFIELD()がどのように機能するか

    2. 2つ以上のテーブルでLEFTJOINを実行するにはどうすればよいですか?

    3. NEWID()を使用してSQLServerで一意の値を作成する

    4. PostgreSQLのシステム列を理解する