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

SQLServerで大文字を含む行を見つける5つの方法

    以下は、SQLServerで大文字を含む行を返すための5つのオプションです。

    サンプルデータ

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

    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 LOWER(c1) COLLATE Latin1_General_CS_AS <> c1;

    結果:

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

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

    COLLATE Latin1_General_CS_ASも使用します 大文字と小文字を区別する(およびアクセントを区別する)照合を明示的に指定します。これがないと、システムで使用されている照合によっては、予期しない結果が生じる可能性があります。

    オプション2:実際の文字と比較する

    別のオプションは、LIKEを使用することです 演算子を使用して、照合する実際の大文字を指定します:

    SELECT c1 FROM t1
    WHERE c1 LIKE '%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'
    COLLATE Latin1_General_CS_AS;

    結果:

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

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

    したがって、このオプションは前のオプションよりも制限されていますが、一致させたい文字をより細かく制御できます。

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

    または、一致させる文字の範囲を指定することもできます:

    SELECT * FROM t1
    WHERE c1 LIKE '%[A-Z]%'
    COLLATE Latin1_General_100_BIN2;

    結果:

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

    この場合、バイナリ照合(Latin1_General_100_BIN2)を使用しました )。これを行ったのは、バイナリ照合によって各ケースが個別に並べ替えられるためです(AB....YZ...ab...yzのように) 。

    他の照合では、大文字と小文字が混ざり合う傾向があります(例:AaBb...YyZz )、したがって、大文字と小文字の両方に一致します。

    オプション4:大文字の最初のインスタンスを検索する

    これを行う別の方法は、PATINDEX()を使用することです。 機能:

    SELECT * FROM t1
    WHERE PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', c1
    COLLATE Latin1_General_CS_AS) > 0;

    結果:

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

    この例では、一致させたい正確な文字を指定しているため、この例では、 like É およびØ (一致した他の文字も含まれているものを除く)。

    この手法の利点の1つは、必要に応じて最初の文字(または指定された文字数)を無視できることです。

    SELECT * FROM t1
    WHERE PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', c1
    COLLATE Latin1_General_CS_AS) > 1;

    結果:

    Time: 0.472s
    +-------+
    | c1    |
    |-------|
    | eCafé |
    +-------+

    したがって、大文字を含むが、最初の文字が大文字ではないすべての行を返すことができます。

    これは、PATINDEX()が原因です。 パターンの最初の出現の開始位置を返します(この場合、パターンは大文字のリストです)。最初の出現の開始位置が1より大きい場合、最初の文字は大文字のリストに含まれていません。

    オプション5:範囲に基づいて最初のインスタンスを検索する

    PATINDEX()を使用することもできます 範囲付き:

    SELECT * FROM t1
    WHERE PATINDEX('%[A-Z]%', c1
    COLLATE Latin1_General_100_BIN2) > 1;

    結果:

    +-------+
    | c1    |
    |-------|
    | eCafé |
    +-------+

    再びバイナリ照合を使用しました(他の範囲の例と同様)。


    1. PostgreSQLでデータベースとテーブルを一覧表示する方法

    2. SQL文字列でのアンパサンド文字のエスケープ

    3. Oracleの行から列への変換

    4. pgAdminでER図を作成する