_ (ワイルドカード - 1 文字に一致) (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

アンダースコア _ を使用し、LIKEPATINDEX などのパターン照合を含む文字列比較操作で任意の 1 文字に一致させます。

A: 簡単な例

次の例では、データベース名の文字 m から始まり、3 番目の文字が d のデータベースがすべて返されます。 アンダースコア文字は、名前の 2 番目の文字は何の文字でもよいことを指定します。 model データベースと msdb データベースがこの条件を満たしています。 master データベースはこの条件を満たしません。

SELECT name FROM sys.databases
WHERE name LIKE 'm_d%';

結果セットは次のようになります。

name
-----
model
msdb

さらに多くのデータベースがこの条件を満たすこともあるでしょう。

複数のアンダースコアを使用し、複数の文字を表すことができます。 LIKE 条件を変更し、2 つのアンダースコア 'm__% を含めると、結果に master データベースが含まれます。

B: より複雑な例

次の例では、_ 演算子を使用して、Person テーブル内の an で終わる 3 文字の名前 (名) を持つすべての人物を検索します。

-- USE AdventureWorks2022;
  
SELECT FirstName, LastName  
FROM Person.Person  
WHERE FirstName LIKE '_an'  
ORDER BY FirstName;  

C: アンダースコア文字をエスケープ処理する

次の例では、db_ownerdb_ddladmin など、固定データベース ロールの名前を返しますが、dbo ユーザーも返します。

SELECT name FROM sys.database_principals
WHERE name LIKE 'db_%';

3 番目の文字位置に入っているアンダースコアはワイルドカードとして扱われ、文字 db_ で始まるプリンシパルだけで絞り込んでくれません。 アンダースコアをエスケープ処理するには、かっこ [_] で囲みます。

SELECT name FROM sys.database_principals
WHERE name LIKE 'db[_]%';

これで dbo ユーザーが除外されます。

結果セットは次のようになります。

name
-------------
db_owner
db_accessadmin
db_securityadmin
...

参照

LIKE (Transact-SQL)
PATINDEX (Transact-SQL)
% (ワイルドカード - 一致する文字列)
[ ] (ワイルドカード - 一致する文字列)
[^] (ワイルドカード - 一致しない文字列)