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

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

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

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

    サンプルデータ

    次のようなテーブルを作成するとします。

    DROP TABLE IF EXISTS t1;
    CREATE TABLE t1 (
        c1 varchar(255)
    );
    
    INSERT INTO t1 (c1) VALUES 
        ('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');
    
    SELECT * FROM t1;

    そのSELECT 最後のステートメントは次のようになります:

    +-----------+
    | c1        |
    +-----------+
    | 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 c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

    結果:

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

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

    SELECT c1
    FROM t1 
    WHERE c1 NOT REGEXP '^[0-9]+$';

    結果:

    +-----------+
    | c1        |
    +-----------+
    | +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 c1 NOT REGEXP '[0-9]+';

    結果:

    +------+
    | c1   |
    +------+
    | a    |
    | Ten  |
    +------+

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

    SELECT c1
    FROM t1 
    WHERE c1 NOT REGEXP '[[:digit:]]';

    結果:

    +------+
    | c1   |
    +------+
    | a    |
    | Ten  |
    +------+

    1. MariaDBでのLOG10()のしくみ

    2. 値ごとのCOUNTによる順序

    3. SQLite-ORDER BY RAND()

    4. IDENTITY列を広げることによる影響の最小化–パート2