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

MySQLで英数字以外の文字のみを含む行を返す2つの方法

    以下は、MySQLで英数字以外の文字のみを含む行を検索するための2つのオプションです。

    英数字以外の文字には、[email protected]#&()–[{}]:;',?/*などの句読文字が含まれます。 および`~$^+=<>“のような記号 、およびスペースやタブ文字などの空白文字。

    サンプルデータ

    例では、次のデータを使用します。

    CREATE TABLE t1 (
        c1 varchar(255) NULL
        );
    
    INSERT INTO t1 VALUES
        ('Music'),
        ('Live Music'),
        ('Café'),
        ('Café Del Mar'),
        ('100 Cafés'),
        ('[email protected]'),
        ('1 + 1'),
        ('()'),
        ('[email protected]#&()–[{}]:;'',?/*'),
        ('`~$^+=<>“'),
        ('$1.50'),
        ('Player 456'),
        ('007'),
        (null),
        (''),
        ('é'),
        ('É'),
        ('é 123'),
        ('ø'),
        ('ø 123');
    SELECT c1 FROM t1;

    結果:

    +----------------------+
    | c1                   |
    +----------------------+
    | Music                |
    | Live Music           |
    | Café                 |
    | Café Del Mar         |
    | 100 Cafés            |
    | [email protected]    |
    | 1 + 1                |
    | ()                   |
    | [email protected]#&()–[{}]:;',?/*   |
    | `~$^+=<>“            |
    | $1.50                |
    | Player 456           |
    | 007                  |
    | NULL                 |
    |                      |
    | é                    |
    | É                    |
    | é 123                |
    | ø                    |
    | ø 123                |
    +----------------------+

    オプション1:[:alnum:]と比較

    MySQLのREGEXPを使用できます 列を正規表現と比較する演算子。

    MySQLの正規表現機能には、POSIX文字クラスのサポートが含まれています。したがって、[:alnum:]を使用できます 正規表現のPOSIX文字クラスを使用して、英数字のみを含む行を検索し、NOTでそれを否定します。 オペレーター。

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

    結果:

    +----------------------+
    | c1                   |
    +----------------------+
    | ()                   |
    | [email protected]#&()–[{}]:;',?/*   |
    | `~$^+=<>“            |
    |                      |
    +----------------------+

    特定の文字を除外する必要がある場合は、いつでもNULLIF()を使用できます。 働き。

    たとえば、最後の行から空の文字列を除外しましょう:

    SELECT c1 FROM t1
    WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

    結果:

    +----------------------+
    | c1                   |
    +----------------------+
    | ()                   |
    | [email protected]#&()–[{}]:;',?/*   |
    | `~$^+=<>“            |
    +----------------------+

    オプション2:文字の範囲を指定する

    これを行う別の方法は、正規表現内で文字の範囲を指定することです。

    例:

    SELECT c1 FROM t1
    WHERE c1 NOT REGEXP '[A-Za-z0-9]';

    結果:

    +----------------------+
    | c1                   |
    +----------------------+
    | ()                   |
    | [email protected]#&()–[{}]:;',?/*   |
    | `~$^+=<>“            |
    |                      |
    | é                    |
    | É                    |
    | ø                    |
    +----------------------+

    そして、空の文字列を削除するには:

    SELECT c1 FROM t1
    WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';

    結果:

    +----------------------+
    | c1                   |
    +----------------------+
    | ()                   |
    | [email protected]#&()–[{}]:;',?/*   |
    | `~$^+=<>“            |
    | é                    |
    | É                    |
    | ø                    |
    +----------------------+

    この場合、除外範囲はéのような英数字をカバーしていませんでした 、É 、およびø 、したがって、出力は英数字以外の文字の真の表現ではありません。とはいえ、少なくともこの方法では、結果に含めたり除外したりする正確な文字を指定するオプションが提供されます。

    REGEXPの代替

    MySQLでは、RLIKE およびREGXP 演算子はREGEXP_LIKE()の同義語です 。したがって、前の例をNOT RLIKEに置き換えることができます。 またはNOT REGEXP_LIKE()

    RLIKEの例 :

    SELECT c1 FROM t1 
    WHERE c1 NOT RLIKE '[[:alnum:]]';

    REGEXP_LIKE()の例 :

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

    1. PHPでMySQLデータをExcelにエクスポートする

    2. MySQL管理者向けのMariaDB列ストアのガイド

    3. 1つのクエリで2つのテーブルにOracleINSERTを実行

    4. MariaDBでのRIGHT()のしくみ