分享方式:


PATINDEX (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

傳回指定運算式所有有效文字與字元資料類型中,模式第一次出現時的起點,若找不到模式,則傳回零。

Transact-SQL 語法慣例

語法

PATINDEX ( '%pattern%' , expression )  

引數

模式
這是字元運算式,其中包含要尋找的順序。 此處可以使用萬用字元,但是 pattern 前後都必須加上 % 字元 (除非要搜尋第一個或最後一個字元)。 pattern 是字元字串資料類型類別目錄的運算式。 pattern 限制為 8000 個字元。

注意

雖然 SQL Server 並非原生支援規則運算式,但仍可透過各種萬用字元運算式,達成類似複雜模式比對的目的。 如需萬用字元語法的詳細資料,請參閱字串運算子文件。

expression
這是運算式,通常是搜尋指定之模式的資料行。 expression 屬於字元字串資料類型類別目錄。

傳回型別

expression 的資料類型為 varchar(max)nvarchar(max),則為 bigint,否則為 int

備註

如果 patternexpression 為 NULL,則 PATINDEX 會傳回 NULL。

PATINDEX 的起始位置是 1。

PATINDEX 會以輸入的定序為基礎來執行比較。 若要執行指定定序的比較,您可以利用 COLLATE,將明確定序套用至輸入。

補充字元 (Surrogate 字組)

使用 SC 定序時,傳回值會將 expression 參數中的任何 UTF-16 代理字組計算為單一字元。 如需詳細資訊,請參閱 Collation and Unicode Support

0x0000 (char(0)) 是 Windows 定序中未定義的字元,而且不得包含在 PATINDEX 中。

範例

A. 簡單的 PATINDEX 範例

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

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

結果集如下所示。

position
--------
3

B. 搭配 PATINDEX 使用模式

下列範例會尋找模式ensure在 AdventureWorks2022 資料庫中數據表中數據行的特定數據列中DocumentDocumentSummary開始的位置。

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

結果集如下所示。

position
--------  
64  

如果您沒有利用 WHERE 子句來限制要搜尋的資料列,查詢會傳回資料表的所有資料列,且針對找到模式的所有資料列報告非零值,找不到模式的所有資料列則會報告零。

C. 搭配 PATINDEX 使用萬用字元

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

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

結果集如下所示。

position
--------  
8  

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

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

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)
_ (萬用字元 - 符合單一字元) (Transact-SQL)
百分比字元 (萬用字元 - 相符的字元) (Transact-SQL)