PATINDEX (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

すべて有効なテキストおよび文字データ型について、指定された式の中で、パターンが最初に現れる先頭位置を返します。パターンが見つからない場合は、0 を返します。

Transact-SQL 構文表記規則

構文

PATINDEX ( '%pattern%' , expression )  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

pattern
検索するシーケンスを含む文字式です。 ワイルドカード文字も指定できますが、(先頭の文字または最後の文字を検索する場合を除き) pattern を % 文字で囲む必要があります。 pattern は文字列データ型に分類される式です。 pattern の上限は 8,000 文字です。

注意

従来の正規表現は、SQL Server でネイティブにサポートされていませんが、さまざまなワイルドカード表現を使用すると、同様の複雑なパターン マッチングを実現することができます。 ワイルドカード構文の詳細については、ドキュメント「文字列演算子」を参照してください。

式 (expression)
です。通常は、指定したパターンで検索する列です。 は文字列データ型に分類されます。

戻り値の型

expressionvarchar(max) または nvarchar(max) データ型の場合は bigint。それ以外の場合は int

注釈

pattern またはが NULL の場合、PATINDEX は NULL を返します。

PATINDEX の開始位置は 1 です。

PATINDEX では、入力の照合順序に基づいて比較が行われます。 指定した照合順序で比較を実行するには、COLLATE を使って入力に明示的な照合順序を適用できます。

補助文字 (サロゲート ペア)

SC の照合順序を使用する場合、戻り値では、expression パラメーターの UTF-16 サロゲート ペアが 1 文字としてカウントされます。 詳細については、「 Collation and Unicode Support」を参照してください。

0x0000 (char(0)) の Windows 照合順序で未定義の文字は、PATINDEX に含めることができません。

A. 簡単な PATINDEX の例

次の例では、文字 ter の開始位置の短い文字列 (interesting data) を確認します。

SELECT position = PATINDEX('%ter%', 'interesting data');  

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

position
--------
3

B. PATINDEX でパターンを使用する

次の例では、AdventureWorks2022 データベースの Document テーブルにある DocumentSummary 列の特定の行で、パターン ensure が始まる位置を検出します。

SELECT position = PATINDEX('%ensure%',DocumentSummary)  
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  
GO   

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

position
--------  
64  

検索する行を WHERE 句で限定しない場合は、クエリによりテーブル内のすべての行が返されます。パターンが見つかった行は 0 以外の値に、パターンが見つからなかったすべての行は 0 になります。

C. PATINDEX でワイルドカード文字を使用する

次の例では、ワイルドカードの % と _ を使用して、指定した文字列で任意の 1 文字と 'en' が続くパターン 'ure' が始まる位置を探します (インデックスは 1 から開始)。

SELECT position = PATINDEX('%en_ure%', 'Please ensure the door is locked!');  

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

position
--------  
8  

PATINDEXLIKE と同様の機能を持つので、任意のワイルドカードを使用できます。 パターンを % で囲む必要はありません。 PATINDEX('a%', 'abc') は 1 を返し、PATINDEX('%a', 'cba') は 3 を返します。

LIKE とは異なり、PATINDEXCHARINDEX と同様に位置を返します。

D. PATINDEX で複雑なワイルドカード式を使用する

次の例では、[^]文字列演算子を使用して、数字、文字、またはスペース以外の文字の位置を検索します。

SELECT position = PATINDEX('%[^ 0-9A-Za-z]%', 'Please ensure the door is locked!'); 

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

position
--------
33

E. PATINDEX で COLLATE を使用する

次の例では、COLLATE 関数を使って、検索する式の照合順序を明示的に指定します。

USE tempdb;  
GO  
SELECT PATINDEX ( '%ein%', 'Das ist ein Test'  COLLATE Latin1_General_BIN) ;  
GO  

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

position
--------
9

F. 変数を使用してパターンを指定する

次の例では、変数を使用して pattern パラメーターに値を渡します。 この例では、AdventureWorks2022 データベースを使います。

DECLARE @MyValue VARCHAR(10) = 'safety';   
SELECT position = PATINDEX('%' + @MyValue + '%', DocumentSummary)   
FROM Production.Document  
WHERE DocumentNode = 0x7B40;  

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

position
--------  
22

参照

LIKE (Transact-SQL)
CHARINDEX (Transact-SQL)
LEN (Transact-SQL)
データ型 (Transact-SQL)
文字列関数 (Transact-SQL)
(ワイルドカード - 一致する文字列) (Transact-SQL)
(ワイルドカード - 一致しない文字列) (Transact-SQL)
_ (ワイルドカード - 1 文字に一致) (Transact-SQL)
パーセント文字 (ワイルドカード - 一致する文字列) (Transact-SQL)