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

PostgreSQLでのisnumeric()

    お気づきかもしれませんが、正規表現ベースの方法を正しく実行することはほとんど不可能です。たとえば、テストでは1.234e-5 有効な番号ではありませんが、実際には有効です。また、あなたは負の数を逃しました。何かが数字のように見えるが、それを保存しようとするとオーバーフローが発生する場合はどうなりますか?

    代わりに、実際にNUMERICにキャストしようとする関数を作成することをお勧めします (またはFLOAT タスクで必要な場合)、TRUEを返します またはFALSE このキャストが成功したかどうかによって異なります。

    このコードは、関数ISNUMERIC()を完全にシミュレートします :

    CREATE OR REPLACE FUNCTION isnumeric(text) RETURNS BOOLEAN AS $$
    DECLARE x NUMERIC;
    BEGIN
        x = $1::NUMERIC;
        RETURN TRUE;
    EXCEPTION WHEN others THEN
        RETURN FALSE;
    END;
    $$
    STRICT
    LANGUAGE plpgsql IMMUTABLE;
    

    データに対してこの関数を呼び出すと、次の結果が得られます。

    WITH test(x) AS ( VALUES (''), ('.'), ('.0'), ('0.'), ('0'), ('1'), ('123'),
      ('123.456'), ('abc'), ('1..2'), ('1.2.3.4'), ('1x234'), ('1.234e-5'))
    SELECT x, isnumeric(x) FROM test;
    
        x     | isnumeric
    ----------+-----------
              | f
     .        | f
     .0       | t
     0.       | t
     0        | t
     1        | t
     123      | t
     123.456  | t
     abc      | f
     1..2     | f
     1.2.3.4  | f
     1x234    | f
     1.234e-5 | t
     (13 rows)
    

    より正確で読みやすいだけでなく、データが実際に数値である場合はより高速に動作します。



    1. SQLiteをJSONに変換する

    2. オペレーター

    3. ORA-00936:式oracleがありません

    4. postgreSQLの左側にゼロを埋める