検索条件のパターン照合

LIKE キーワードは、指定したパターンに一致する文字列、日付値、または時刻値を検索します。詳細については、「データ型 (Transact-SQL)」を参照してください。LIKE キーワードは、正規表現を使用して、値の比較対象パターンを指定します。パターンには検索対象の文字列が含まれています。また、パターンでは次の 4 つのワイルドカードを任意に組み合わせて使用できます。

ワイルドカード

意味

%

0 個以上の文字で構成される任意の文字列です。

_

任意の 1 文字です。

[ ]

指定した範囲 (たとえば [a-f]) またはセット (たとえば [abcdef]) 内の任意の 1 文字です。

[^]

指定した範囲 (たとえば [^a-f]) またはセット (たとえば [^abcdef]) 内にない任意の 1 文字です。

ワイルドカードおよび文字列は単一引用符で囲みます。次に例を示します。

  • LIKE 'Mc%' では、Mc という文字で始まるすべての文字列 (McBadden など) が検索されます。

  • LIKE '%inger' では、inger という文字で終わるすべての文字列 (Ringer、Stringer など) が検索されます。

  • LIKE '%en%' では、文字列内の任意の位置に en という文字を含むすべての文字列 (Bennet、Green、McBadden など) が検索されます。

  • LIKE '_heryl' では、heryl という文字で終わる 6 文字の名前 (Cheryl、Sheryl など) がすべて検索されます。

  • LIKE '[CK]ars[eo]n' では、Carsen、Karsen、Carson、および Karson が検索されます。

  • LIKE '[M-Z]inger' では、M ~ Z のいずれかの 1 文字で始まり inger という文字で終わるすべての名前 (Ringer など) が検索されます。

  • LIKE 'M[^c]%' では、M という文字で始まり、2 文字目が c という文字ではないすべての名前 (MacFeather など) が検索されます。

次のクエリでは、Person テーブル内の市外局番が 415 であるすべての電話番号が検索されます。

SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone LIKE '415%';

同じワイルドカードと共に NOT LIKE を使用することもできます。Person テーブル内の市外局番が 415 以外のすべての電話番号を検索するには、次の 2 つの同等のクエリのいずれかを使用します。

SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone NOT LIKE '415%';

-- Or

SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE NOT Phone LIKE '415%';

IS NOT NULL 句には、ワイルドカードおよび LIKE 句を使用できます。たとえば、次のクエリでは、415 で始まり IS NOT NULL の電話番号を Person テーブルから取得します。

USE AdventureWorks2008R2;
GO
SELECT Phone
FROM Person.Person
WHERE Phone LIKE '415%' and Phone IS NOT NULL;
重要な注意事項重要

LIKE キーワードを含むステートメントの出力は、インストール時に選択した並べ替え順によって異なります。異なる並べ替え順による影響の詳細については、「照合順序の使用」を参照してください。

text 型の列で使用できる WHERE 条件は、LIKE、IS NULL、または PATINDEX のみです。

LIKE を指定せずにワイルドカードを使用する場合、そのワイルドカードはパターンとしてではなく、定数として解釈されます。つまり、ワイルドカードによって、それ自体の値しか表現されません。次のクエリでは、415% という 4 文字で構成される電話番号のみがすべて検索されます。415 で始まる電話番号は検索されません。定数の詳細については、「定数 (データベース エンジン)」を参照してください。

SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone = '415%';

ワイルドカードを使用する際は、パフォーマンスへの影響について考慮することも重要です。ワイルドカードが式の先頭にある場合は、インデックスを使用できません (電話帳を引くときに 'Smith' ではなく '%mith' という名前が指定されていると、どこを探せばよいかがわからないことと同じです)。式の中または最後でワイルドカードを使用する場合は、インデックスを使用できます (これも、電話帳を引くときに 'Samuel%' という名前が指定されていれば、Samuels や Samuelson という名前が両方とも記載されているかどうかに関係なく、どこを探せばよいかわかることと同じです)。

ワイルドカード文字の検索

ワイルドカード文字は検索できます。通常はワイルドカードとして使用される文字を指定するには、次の 2 つの方法があります。

  • ESCAPE キーワードを使用してエスケープ文字を定義します。パターン内のワイルドカードの前にエスケープ文字を追加すると、ワイルドカードは文字として解釈されます。たとえば、文字列内の任意の位置に 5% という文字列を含むものを検索するには、次のクエリを使用します。

    WHERE ColumnA LIKE '%5/%%' ESCAPE '/'
    

    この LIKE 句では、最初と最後のパーセント記号 (%) はワイルドカードとして解釈され、スラッシュ (/) の後ろのパーセント記号はパーセントを意味する % 記号として解釈されます。

  • 角かっこ ([ ]) を使用してワイルドカードのみを囲みます。検索範囲を指定するためにハイフン (-) を使用するのではなく、ハイフンを検索するには、次のように角かっこの中の最初の文字としてハイフンを使用します。

    WHERE ColumnA LIKE '9[-]5'
    

    次の表に、角かっこで囲んだワイルドカードの使用方法を示します。

    記号

    意味

    LIKE '5[%]'

    5%

    LIKE '5%'

    5 で始まり、0 個以上の文字で構成される任意の文字列

    LIKE '[_]n'

    _n

    LIKE '_n'

    an、in、on など

    LIKE '[a-cdf]'

    a、b、c、d、または f

    LIKE '[-acdf]'

    -、a、c、d、または f

    LIKE '[ [ ]'

    [

    LIKE ']'

    ]

LIKE を使用して文字列の比較を実行するときは、先頭や末尾にある空白を含め、パターン文字列内のすべての文字が意味を持ちます。LIKE 'abc ' の文字列 (abc の後に 1 つのスペースがある) を含むすべての行を返すような比較を要求すると、列の値が abc (abc の後にスペースがない) である行は返されません。ただし、逆の場合はそうではありません。パターンに一致する式の末尾にある空白は無視されます。LIKE 'abc' の文字列 (abc の後にスペースがない) を含むすべての行を返すような比較を要求すると、abc で始まり、その後に 0 個以上の空白が続くすべての行が返されます。