PATINDEX(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉庫Microsoft Fabric 中的 SQL 資料庫

在所有有效的文字和字元資料類型上,傳回指定運算式中第一次出現模式的起始位置,如果找不到模式,則為零。

Transact-SQL 語法慣例

Syntax

PATINDEX ( '%pattern%' , expression )

Arguments

pattern

包含要找到之序列的字元表達式。 可以使用萬用卡角色;然而,% 字必須排在前面並遵循 模式 (搜尋第一個或最後一個字元時除外)。 pattern 是字串資料型態類別的表達式。 模式 限制為8,000字元。

Note

雖然 SQL Server 2022 (16.x) 和更早版本本身不支援傳統正規表示式,但可以使用各種萬用字元運算式來達成類似的複雜模式比對。 欲了解更多百用字元語法,請參閱 字串運算子 文件。 關於 SQL Server 2025(17.x)中正則表達式函式的資訊,請參見 正則表達式函式。

expression

一個 表達式,通常是用來搜尋指定模式的欄位。 表達 式屬於字串資料類型類別。

傳回類型

若表達式為 varchar(max) 或 nvarchar(max) 資料型態,則為 bigint;否則,智力。

Remarks

若模式為 NULL,則PATINDEX返回 NULL。

如果 expression 是 NULL, PATINDEX 則傳回錯誤。

的 PATINDEX 起始位置是 1。

PATINDEX 根據輸入的對照執行比較。 若要在指定的定序中執行比較,您可以使用 將 COLLATE 明確定序套用至輸入。

補充字元 (代理配對)

當你使用帶有補充字元(SC)的校列時,回傳值會將 表達式 參數中任意 UTF-16 替代對視為單一字元。 如需詳細資訊,請參閱定序和 Unicode 支援。

0x0000 (char(0)) 是 Windows 定序中未定義的字元,無法包含在 PATINDEX.

Examples

A. 基本 PATINDEX 範例

下例範例會檢查 interesting data字元開頭位置的短字元字串 (ter)。

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

結果集如下所示。

position
--------
3

B. 搭配 PATINDEX 使用型樣

以下範例找出 ensure AdventureWorks2025 資料庫中該欄位DocumentSummary特定列Document中圖案起點的位置。

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

結果集如下所示。

position
--------
64

如果您未使用子句來 WHERE 限制要搜尋的資料列,則查詢會傳回資料表中的所有資料列,並報告找到型樣的資料列的非零值,並報告找不到型樣的所有資料列的零值。

C. 搭配 PATINDEX 使用萬用字元

下列範例在指定的字串中 (索引從 1 開始),使用 % 和 _ 萬用字元來尋找模式 'en' 後面接著任何一個字元和 'ure' 的開始位置:

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

結果集如下所示。

position
--------
8

PATINDEX 的運作方式就像 LIKE,所以您可以使用任何萬用字元。 您不必將模式括在百分比之間。 PATINDEX('a%', 'abc') 會傳回 1 且 PATINDEX('%a', 'cba') 會傳回 3。

與 LIKE 不同的是,PATINDEX 會傳回位置,類似 CHARINDEX。

D. 搭配 PATINDEX 使用複雜的萬用字元運算式

以下範例使用 [^]字串運算 子來尋找非數字、字母或空格的字元位置。

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

結果集如下所示。

position
--------
33

E. 與 PATINDEX 的使用COLLATE

下列範例利用 COLLATE 函數來明確指定所搜尋之運算式的定序。

USE tempdb;
GO

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

結果集如下所示。

position
--------
9

F. 使用變數來指定型樣

以下範例使用變數將值傳遞給 模式 參數。 此範例使用 AdventureWorks2025 資料庫。

DECLARE @MyValue AS VARCHAR (10) = 'safety';

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

結果集如下所示。

position
--------
22