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

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

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

    英数字は、英字と英数字です。

    サンプルデータ

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

    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文字クラス。

    SELECT c1 FROM t1 
    WHERE c1 REGEXP '^[[:alnum:] ]+$';

    結果:

    +-------+
    | c1    |
    +-------+
    | Music |
    | Café  |
    | 007   |
    | é     |
    | É     |
    | ø     |
    +-------+

    これにより、英数字のみを含む行のみが返されました。行に英数字と英数字以外の文字の両方が含まれている場合、その行は返されません。

    スペース文字は英数字以外と見なされるため、スペースを含める場合は、次のように実行できます。

    SELECT c1 FROM t1 
    WHERE c1 REGEXP '^[[:alnum:] ]+$';

    結果:

    +---------------+
    | c1            |
    +---------------+
    | Music         |
    | Live Music    |
    | Café          |
    | Café Del Mar  |
    | 100 Cafés     |
    | Player 456    |
    | 007           |
    | é             |
    | É             |
    | é 123         |
    | ø             |
    | ø 123         |
    +---------------+

    含むすべての行を返す 英数字(行に英数字以外の文字も含まれている場合でも)、これを行うことができます:

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

    結果:

    +-------------------+
    | c1                |
    +-------------------+
    | Music             |
    | Live Music        |
    | Café              |
    | Café Del Mar      |
    | 100 Cafés         |
    | [email protected] |
    | 1 + 1             |
    | $1.50             |
    | Player 456        |
    | 007               |
    | é                 |
    | É                 |
    | é 123             |
    | ø                 |
    | ø 123             |
    +-------------------+

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

    これを行う別の方法は、文字の範囲を提供する正規表現を提供することです。 REGEXPは引き続き使用できます これを行う演算子。

    例:

    SELECT c1 FROM t1 
    WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

    結果:

    +-------+
    | c1    |
    +-------+
    | Music |
    | 007   |
    +-------+

    これにより、最初の例よりも少ない行が返されました。 éを含めなかったからです 、É 、またはø 私の範囲内の文字であるため、それらの文字を含む行はすべて出力から除外されます。

    したがって、この方法を使用するときは、含める必要のある文字を誤って除外した場合に備えて注意する必要があります。

    ただし、この範囲を維持しながら、次のようなスペースを含めることができます:

    SELECT c1 FROM t1 
    WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

    結果:

    +------------+
    | c1         |
    +------------+
    | Music      |
    | Live Music |
    | Player 456 |
    | 007        |
    +------------+

    また、以下を使用して、含むすべての行を含めることができます。 私たちの範囲の文字(この範囲外の文字も含まれている場合でも):

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

    結果:

    +-------------------+
    | c1                |
    +-------------------+
    | Music             |
    | Live Music        |
    | Café              |
    | Café Del Mar      |
    | 100 Cafés         |
    | [email protected] |
    | 1 + 1             |
    | $1.50             |
    | Player 456        |
    | 007               |
    | é 123             |
    | ø 123             |
    +-------------------+

    REGEXPの代替

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

    RLIKEの例 :

    SELECT c1 FROM t1 
    WHERE c1 RLIKE '^[[:alnum:]]+$';

    REGEXP_LIKE()の例 :

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

    1. PDOが疑問符をプレースホルダーとして解釈しないようにするにはどうすればよいですか?

    2. MySQL-このバージョンのMySQLは、'LIMIT&IN / ALL / ANY/SOMEサブクエリをまだサポートしていません

    3. SQLServerのOracle外部テーブルに相当します

    4. 分割された区切り文字列を列に挿入するいくつかの方法