SQL Serverで小文字を含む行を検索する必要がある場合は、次のいずれかのオプションを試すことができます。
サンプルデータ
次のデータを含むテーブルがあるとします。
SELECT c1 FROM t1;
結果:
+----------------+ | c1 | |----------------| | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
次のメソッドを使用して、小文字を含む行を返すことができます。
オプション1:UPPER()
と比較する 文字列
UPPER()
を使用できます 元の値を同等の大文字と比較する関数:
SELECT * FROM t1
WHERE UPPER(c1) COLLATE Latin1_General_CS_AS <> c1;
結果:
+----------------+ | c1 | |----------------| | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +----------------+
等しくない(<>
を使用する )演算子(代わりに !=
を使用できます <>
の代わりに 必要に応じて)、大文字とは異なる行のみを返します。これを行う理由は、値が同等の大文字と同じである場合、そもそもすでに大文字であるためです(そして、それを返したくないのです)。
COLLATE Latin1_General_CS_AS
も使用します 大文字と小文字を区別する(およびアクセントを区別する)照合を明示的に指定します。これがないと、システムで使用されている照合によっては、予期しない結果が生じる可能性があります。
オプション2:実際のキャラクターと比較する
または、LIKE
を使用することもできます 演算子を入力し、照合する実際の小文字を指定します:
SELECT * FROM t1
WHERE c1 LIKE '%[abcdefghijklmnopqrstuvwxyz]%'
COLLATE Latin1_General_CS_AS;
結果:
+----------------+ | c1 | |----------------| | Café | | café | | 1café | | eCafé | | James Bond 007 | +----------------+
この場合、前の例よりも少ない行が返されます。 é
のような文字を指定しなかったためです およびø
、前の例で返された。 1つの行にはé
が含まれていますが 、その行が返されたのは、一致する他の小文字も含まれているためです。
したがって、この例は前の例よりも制限されていますが、一致させたい文字をより細かく制御できます。
オプション3:文字の範囲と比較する
または、一致させる文字の範囲を指定することもできます:
SELECT * FROM t1
WHERE c1 LIKE '%[a-z]%'
COLLATE Latin1_General_100_BIN2;
結果:
+----------------+ | c1 | |----------------| | Café | | café | | 1café | | eCafé | | James Bond 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é | | 1café | | eCafé | | James Bond 007 | +----------------+
この例では、一致させたい正確な文字を指定しているため、この例では、é
のような文字を含む行は取得されませんでした。 およびø
(一致した他の文字も含まれているものを除く)。
この手法の利点の1つは、必要に応じて最初の文字(または指定された文字数)を無視できることです。
SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 1;
結果:
+----------------+ | c1 | |----------------| | Café | | 1café | | James Bond 007 | +----------------+
したがって、小文字を含むすべての行を返すことができますが、最初の文字は小文字ではありません。
これは、PATINDEX()
が原因です。 パターンの最初の出現の開始位置を返します(この場合、パターンは小文字のリストです)。最初の出現の開始位置が1より大きい場合、最初の文字は小文字のリストに含まれていません。
この手法を使用して最初の文字が大文字であることを無視することはできますが、最初の文字が数字などの別の文字である可能性を排除するものではありません。これは、1café
を含む2行目に表示されます。 。
オプション5:範囲に基づいて最初のインスタンスを検索する
PATINDEX()
を使用することもできます 範囲付き:
SELECT * FROM t1
WHERE PATINDEX('%[a-z]%', c1
COLLATE Latin1_General_100_BIN2) > 1;
結果:
+----------------+ | c1 | |----------------| | Café | | 1café | | James Bond 007 | +----------------+
再びバイナリ照合を使用しました(他の範囲の例と同様)。