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

MySQLで大文字を含む行を見つける3つの方法

    MySQLで大文字を含む行を返すための3つのオプションを次に示します。

    サンプルデータ

    次のデータを含むテーブルがあるとします。

    SELECT c1 FROM t1;

    結果:

    +----------------+
    | c1             |
    +----------------+
    | CAFÉ           |
    | Café           |
    | café           |
    | 1café          |
    | eCafé          |
    | James Bond 007 |
    | JB 007         |
    | 007            |
    | NULL           |
    |                |
    | É              |
    | É 123          |
    | é              |
    | é 123          |
    | ø              |
    | Ø              |
    +----------------+

    次のメソッドを使用して、大文字を含む行を返すことができます。

    オプション1:LOWER()と比較 文字列

    LOWER()を使用できます 元の値を同等の小文字と比較する関数:

    SELECT c1 FROM t1
    WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

    結果:

    +----------------+
    | c1             |
    +----------------+
    | CAFÉ           |
    | Café           |
    | eCafé          |
    | James Bond 007 |
    | JB 007         |
    | É              |
    | É 123          |
    | Ø              |
    +----------------+

    等しくない(<>を使用する )演算子(代わりに!=を使用できます <>の代わりに 必要に応じて)、同等の小文字とは異なる行のみを返します。これを行う理由は、値が同等の小文字と同じである場合、そもそもすでに小文字であるためです(そして、それを返したくないのです)。

    デフォルトでは、MySQLは大文字と小文字を区別しない検索を実行するため、CAST()を使用します 大文字と小文字を区別して検索するために、値をバイナリにキャストする関数。

    BINARYを使用することもできます 値をバイナリにキャストする演算子ですが、この演算子はMySQL 8.0.27で非推奨になり、将来のリリースで削除される可能性があります。

    いずれにせよ、これはBINARYを使用したときのコードのようになります 演算子:

    SELECT c1 FROM t1
    WHERE BINARY LOWER(c1) <> BINARY c1;

    次のようにすることもできます:

    SELECT c1 FROM t1
    WHERE BINARY(LOWER(c1)) <> BINARY(c1);

    MySQL 8.0.27でコードを実行したときに、これらの両方から得られる結果は次のとおりです。

    +----------------+
    | c1             |
    +----------------+
    | CAFÉ           |
    | Café           |
    | eCafé          |
    | James Bond 007 |
    | JB 007         |
    | É              |
    | É 123          |
    | Ø              |
    +----------------+
    8 rows in set, 2 warnings (0.00 sec)

    そして、私が警告を表示するとき:

    SHOW WARNINGS;

    結果:

    +---------+------+----------------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                                      |
    +---------+------+----------------------------------------------------------------------------------------------+
    | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
    | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
    +---------+------+----------------------------------------------------------------------------------------------+

    オプション2:実際のキャラクターと比較する

    もう1つのオプションは、REGEXPを使用することです。 照合する各大文字を明示的に含む正規表現パターンを持つ演算子:

    SELECT c1 FROM t1
    WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

    結果:

    +----------------+
    | c1             |
    +----------------+
    | CAFÉ           |
    | Café           |
    | eCafé          |
    | James Bond 007 |
    | JB 007         |
    +----------------+

    今回は、前の例よりも少ない行が返されます。 Éのような文字を指定しなかったためです およびØ 、これらの例で返されました。結果にはÉが含まれています ただし、その行が返されたのは、実行する他の大文字も含まれているためです。 一致します。

    したがって、このオプションを使用する場合は、すべての有効な文字がカバーされていることを確認する必要があります。

    オプション3:文字の範囲と比較する

    もう1つの方法は、一致させる大文字の範囲を指定することです。

    SELECT c1 FROM t1
    WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

    結果:

    +----------------+
    | c1             |
    +----------------+
    | CAFÉ           |
    | Café           |
    | eCafé          |
    | James Bond 007 |
    | JB 007         |
    +----------------+

    1. Postgres UTC日付形式とエポックキャスト、符号反転

    2. SELECT、WHERE、およびORDER BY句の結果を再利用するにはどうすればよいですか?

    3. MySQL DROPFOREIGNKEY制約

    4. データベースの依存関係とは何ですか?