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

Oracleの列にあるすべての非数値を検索する

    数値列であるはずの文字列に遭遇した場合、知らない非数値データが含まれている可能性が常にあります。

    Oracle Databaseでは、次のようなクエリを実行して、列から数値以外のデータを返すことができます。

    サンプルデータ

    VARCHAR2を使用してサンプルテーブルを作成しましょう 列と挿入データ:

    DROP TABLE t1;
    CREATE TABLE t1 (
        c1 varchar2(255)
    );
    INSERT ALL 
    INTO t1 (c1) VALUES ('0')
    INTO t1 (c1) VALUES ('1')
    INTO t1 (c1) VALUES ('+1')
    INTO t1 (c1) VALUES ('-1')
    INTO t1 (c1) VALUES ('00.00')
    INTO t1 (c1) VALUES ('73.45')
    INTO t1 (c1) VALUES ('+73.45')
    INTO t1 (c1) VALUES ('-73.45')
    INTO t1 (c1) VALUES ('.246')
    INTO t1 (c1) VALUES ('-.34e7')
    INTO t1 (c1) VALUES ('12.e-3')
    INTO t1 (c1) VALUES ('1.2e+4')
    INTO t1 (c1) VALUES ('a')
    INTO t1 (c1) VALUES ('9afc')
    INTO t1 (c1) VALUES ('e7')
    INTO t1 (c1) VALUES ('+e0')
    INTO t1 (c1) VALUES ('Ten')
    INTO t1 (c1) VALUES ('5 Dollars')
    SELECT 1 FROM DUAL;

    表の内容は次のとおりです。

    SELECT * FROM t1;

    結果:

    0
    1
    +1
    -1
    00.00
    73.45
    +73.45
    -73.45
    .246
    -.34e7
    12.e-3
    1.2e+4
    a
    9afc
    e7
    +e0
    Ten
    5 Dollars

    列はvarchar(255)です 列なので、数値ではありません。数字を含めることができます(実際に含めることができます)が、これらは文字データとして保存されます。任意のテキストを含めることもできます(これは含まれます)。

    すべての非数値を返す

    次のクエリを使用して、上記の表から数値以外の値を返すことができます。

    SELECT c1
    FROM t1 
    WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');

    結果:

    12.e-3
    a
    9afc
    e7
    +e0
    Ten
    5 Dollars
    非整数を返す

    非整数のみを返したい場合は、クエリをはるかに簡単にすることができます:

    SELECT c1
    FROM t1 
    WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');

    結果:

    +1
    -1
    00.00
    73.45
    +73.45
    -73.45
    .246
    -.34e7
    12.e-3
    1.2e+4
    a
    9afc
    e7
    +e0
    Ten
    5 Dollars

    この例では符号付き整数も除外されていることに注意してください。

    数値データが含まれていません

    数値データを含まない行を検索するだけの場合は、次のように実行できます。

    SELECT c1 
    FROM t1 
    WHERE NOT REGEXP_LIKE(c1, '[0-9]+');

    結果:

    a
    Ten

    あるいは、POSIXクラスを使用して同じ結果を得ることができます:

    SELECT c1 
    FROM t1 
    WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');

    結果:

    a
    Ten

    1. SQL ServerのSESSIONPROPERTY()を使用してセッション設定を確認します

    2. SQLServerコレクションインベントリスクリプト-3

    3. DBMS_METADATA(およびSCHEMA_EXPORT)を使用してOracleSCHEMAをDDLスクリプトとして取得するにはどうすればよいですか。

    4. PostgreSQL8.4で列のデータ型を文字から数値に変更する方法