以下は、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é | +-------+
再びバイナリ照合を使用しました(他の範囲の例と同様)。