LIKE (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のSQL 分析エンドポイント Microsoft Fabric のウェアハウス
指定された文字列が指定されたパターンと一致するかどうかを判断します。 パターンは、標準の文字とワイルドカード文字を含むことができます。 パターン検索時に、標準の文字は文字列に指定された文字と正確に一致する必要があります。 しかし、ワイルドカード文字は文字列の任意の部分と一致することができます。 =
や !=
などの文字列比較演算子を使用する場合と比べて、ワイルドカード文字を使用する方がより柔軟に LIKE
演算子を使用できます。 引数が文字列データ型でない場合、SQL Server データベース エンジン は可能であれば引数を文字列データ型に変換します。
構文
SQL Server と Azure SQL Database の構文:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Azure Synapse Analytics と Parallel Data Warehouse の構文:
match_expression [ NOT ] LIKE pattern
Azure Synapse Analytics または Analytics Platform System (PDW) では、ESCAPE
および STRING_ESCAPE
はサポートされていません。
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
match_expression
文字データ型の任意の有効な式です。
pattern
match_expression で検索する特定の文字列であり、次の表内の有効なワイルドカード文字を含めることができます。 pattern は、最大 8,000 バイトにすることができます。
match_expression が pattern より優先順位の高いデータ型であり、pattern の長さが match_expression より長い場合は、pattern の値を match_expression 型に暗黙的に変換するときに、切り捨てエラーが発生します。
ワイルドカード文字 | 説明 | 例 |
---|---|---|
% |
0 個以上の文字で構成される任意の文字列です。 | WHERE title LIKE '%computer%' と指定すると、書籍のタイトルに computer という単語が含まれるすべてのタイトルが検索されます。 |
_ (アンダースコア) |
任意の 1 文字です。 | WHERE au_fname LIKE '_ean' と指定すると、ean で終わる 4 文字のすべてのファースト ネーム (Dean や Sean など) が検索されます。 |
[ ] |
指定した範囲 [a-f] またはセット [abcdef] の任意の 1 文字。 |
WHERE au_lname LIKE '[C-P]arsen' と指定すると、Carsen 、Larsen 、Karsen などのように、姓が C から P の間にある任意の 1 文字で始まり、arsen で終わる著者が検索されます。 範囲で検索する場合、照合順序の並べ替え規則に応じて範囲に含まれる文字が変わります。 |
[^] |
指定した範囲 [^a-f] または セット [^abcdef] 内に含まれない任意の 1 文字。 |
WHERE au_lname LIKE 'de[^l]%' と指定すると、姓が de で始まり、次の文字が l ではないすべての著者が検索されます。 |
escape_character
特定のワイルドカードがワイルドカードとしてではなく標準の文字として解釈されるように、そのワイルドカード文字の前に配置する文字です。 escape_character は、既定値を持たない文字式であり、1 文字に評価される必要があります。
結果の種類
Boolean
結果の値
match_expression が、指定された pattern と一致する場合、LIKE
は TRUE を返します。
解説
LIKE
を使用して文字列の比較を行うときは、パターン文字列中のすべての文字が比較の対象になります。 重要な文字として先頭または末尾のスペースがあります。 クエリ内の比較で LIKE 'abc '
文字列 (abc
に空白が 1 つ続く) を含むすべての行が返される場合、列の値が abc
(abc
の後ろに空白がない) の行は返されません。 ただし、パターンが一致する式の中の後続する空白は無視されます。 クエリ内の比較で LIKE 'abc'
文字列 (abc
の後ろに空白がない) を含むすべての行が返される場合、abc
で始まり、ゼロ個以上の空白が後続するすべての行が返されます。
char および varchar データを含むパターンを使用した文字列比較では、データ型ごとにデータの格納方法に制約があるため、LIKE
比較を渡すことができません。 次の例では、ローカル変数 char をストアド プロシージャに渡し、パターン マッチングを使用して、姓が指定された文字のセットで始まるすべての従業員を検索します。
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName CHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
FindEmployee
プロシージャでは、20 文字未満の名前の場合、必ず char 変数 (@EmpLName
) に後続する空白が含まれるため、行は返されません。 LastName
列は varchar であるため、後続する空白は含まれていません。 後続する空白が意味を持つため、このプロシージャは失敗します。
次の例では、後続する空白は varchar 変数に追加されないので、検索は成功します。
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
結果セットは次のようになります。
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
LIKE を使用したパターン マッチ
LIKE
では、ASCII のパターン マッチングと Unicode のパターン マッチングがサポートされています。 すべての引数 (match_expression、pattern、および escape_character) が ASCII 文字型の場合は、ASCII パターン検索が行われます。 引数のいずれかが Unicode データ型の場合は、すべての引数が Unicode に変換されて、Unicode パターン マッチングが実行されます。 LIKE
で Unicode データ (nchar または nvarchar データ型) を使用する場合、後続する空白は意味を持ちます。しかし、Unicode 以外のデータの場合、後続する空白は意味を持ちません。 Unicode LIKE
は、ISO 標準と互換性があります。 ASCII LIKE
は、以前のバージョンの SQL Server と互換性があります。
次の一連の例では、ASCII と Unicode の LIKE
パターン マッチング間で返される行の違いを示します。
-- ASCII pattern matching with char column
CREATE TABLE t (col1 CHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- returns 1 row
-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- no rows returned
-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE RTRIM(col1) LIKE '% King'; -- returns 1 row
注意
LIKE
比較は、照合順序の影響を受けます。 詳細については、「COLLATE (Transact-SQL)」を参照してください。
%
ワイルドカード文字の使用
LIKE '5%'
と指定すると、データベース エンジンは数字の 5
を先頭に 0 個以上の文字が続く文字列を検索します。
たとえば、次のクエリは、AdventureWorks2022
データベース内のすべての動的管理ビューを表示します。これらのすべての動的管理ビューは、文字 dm
で始まるためです。
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
動的管理ビューではないすべてのオブジェクトを表示するには、NOT LIKE 'dm%'
を使用します。 仮に、オブジェクトの総数が 32 で、LIKE
によりパターンに一致する名前が 13 件発見されるとすると、NOT LIKE
は LIKE
パターンに一致しないオブジェクトを 19 件発見します。
LIKE '[^d][^m]%'
のようなパターンと一致する名前が検索されるとは限りません。 NOT LIKE の 19 件に対して、このパターンでは 14 件しか検索できません。d
で始まる名前、または 2 文字目が m
の名前は、すべて結果および動的管理ビュー名から削除されます。 この動作は、否定ワイルドカード文字を使用した検索文字列は 1 文字ずつ順番に評価されるために生じます。 評価のいずれかの段階で一致しなければ、削除されます。
ワイルドカード文字をリテラルとして使用する
ワイルドカード パターン検索文字をリテラル文字として使用できます。 ワイルドカード文字をリテラル文字として使用するには、ワイルドカード文字をかっこで囲みます。 次の表は、LIKE
キーワードと [ ]
ワイルドカード文字の使用例を示しています。
Symbol | 意味 |
---|---|
LIKE '5[%]' |
5% |
LIKE '[_]n' |
_n |
LIKE '[a-cdf]' |
a 、b 、c 、d 、または f |
LIKE '[-acdf]' |
- 、a 、c 、d 、または f |
LIKE '[ [ ]' |
[ |
LIKE ']' |
] |
LIKE 'abc[_]d%' |
abc_d および abc_de |
LIKE 'abc[def]' |
abcd 、abce 、abcf |
ESCAPE 句を使用するパターン マッチ
1 文字以上の特殊なワイルドカード文字を含む文字列を検索できます。 たとえば、customers データベース内の discounts テーブルには、パーセント記号 (%) を含む割引の値が格納されています。 ワイルドカード文字ではなく、文字としてパーセント記号を検索するには、ESCAPE キーワードとエスケープ文字を指定する必要があります。 たとえば、サンプル データベースには、"30%" というテキストを含んでいる comment という名前の列があります。 comment 列内の任意の場所で文字列 "30%" を含んでいる任意の行を検索するには、WHERE comment LIKE '%30!%%' ESCAPE '!'
などの WHERE 句を指定します。 ESCAPE とエスケープ文字を指定していない場合、データベース エンジン は文字列 30!
を含む行を返します。
LIKE パターンでエスケープ文字の後に文字がない場合、そのパターンは無効になり、LIKE は FALSE を返します。 エスケープ文字の後にある文字がワイルドカード文字ではない場合、このパターンの中ではエスケープ文字は破棄され、次の文字は通常の文字として扱われます。 これらの文字には、2 つの角かっこ ([ ]) に囲まれたパーセント記号 (%)、アンダースコア (_)、および左角かっこ ([) の各ワイルドカード文字が含まれます。 エスケープ文字は、キャレット (^)、ハイフン (-)、または右大かっこ (]) をエスケープする場合などに、二重大かっこ ([]) で囲んで使用できます。
0x0000
(char(0)) は Windows 照合順序での未定義の文字で、LIKE に含めることはできません。
例
A. LIKE を %
ワイルドカード文字と共に使用する
次の例では、415
テーブルで市外局番 PersonPhone
を持つすべての電話番号を検索します。
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber LIKE '415%'
ORDER BY p.LastName;
GO
結果セットは次のようになります。
FirstName LastName Phone
----------------- ------------------- ------------
Ruben Alonso 415-555-124
Shelby Cook 415-555-0121
Karen Hu 415-555-0114
John Long 415-555-0147
David Long 415-555-0123
Gilbert Ma 415-555-0138
Meredith Moreno 415-555-0131
Alexandra Nelson 415-555-0174
Taylor Patterson 415-555-0170
Gabrielle Russell 415-555-0197
Dalton Simmons 415-555-0115
(11 row(s) affected)
B. NOT LIKE を %
ワイルドカード文字と共に使用する
次の例では、PersonPhone
テーブルで 415
以外の市外局番を持つすべての電話番号を検索します。
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber NOT LIKE '415%'
AND p.FirstName = 'Gail'
ORDER BY p.LastName;
GO
結果セットは次のようになります。
FirstName LastName Phone
---------------------- -------------------- -------------------
Gail Alexander 1 (11) 500 555-0120
Gail Butler 1 (11) 500 555-0191
Gail Erickson 834-555-0132
Gail Erickson 849-555-0139
Gail Griffin 450-555-0171
Gail Moore 155-555-0169
Gail Russell 334-555-0170
Gail Westover 305-555-0100
(8 row(s) affected)
C. ESCAPE 句を使用する
次の例では、ESCAPE
句とエスケープ文字を使用して、mytbl2
テーブルの列 c1
内にある文字列 10-15%
と完全に一致する文字列を検索します。
USE tempdb;
GO
IF EXISTS (
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytbl2'
)
DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2 (c1 SYSNAME);
GO
INSERT mytbl2
VALUES ('Discount is 10-15% off'),
('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
D. [ ]
ワイルドカード文字を使用する
次の例では、Person
テーブルで、名前が Cheryl
またはSheryl
である従業員を検索します。
-- Uses AdventureWorks
SELECT BusinessEntityID,
FirstName,
LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
次の例では、Person
テーブルで、姓が Zheng
または Zhang
である従業員の行を検索します。
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC,
FirstName ASC;
GO
例: Azure Synapse Analytics、Analytics Platform System (PDW)
E. LIKE を %
ワイルドカード文字と共に使用する
次の例では、DimEmployee
テーブルで 612
で始まる電話番号を持つすべての従業員を検索します。
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;
F. NOT LIKE を %
ワイルドカード文字と共に使用する
次の例では、DimEmployee
テーブルで 612
以外で始まるすべての電話番号を検索します。
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
G. LIKE を _
ワイルドカード文字と共に使用する
次の例では、DimEmployee
テーブルで、6
で始まり 2
で終る市外局番を持つすべての電話番号を検索します。 ワイルドカード文字 % は、検索パターンの末尾に含まれており、電話の列値の後続のすべての文字と一致します。
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;