PATINDEX (Transact-SQL)
傳回指定之運算式中的模式,在所有有效文字和字元資料類型中第一次出現的起始位置,如果找不到模式,便傳回零。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
PATINDEX ( '%pattern%' , expression )
引數
pattern
這是字元運算式,其中包含要尋找的順序。 此處可以使用萬用字元,但是 pattern 前後都必須加上 % 字元 (除非要搜尋第一個或最後一個字元)。 pattern 是字元字串資料類型類別目錄的運算式。 pattern 限制為 8000 個字元。expression
這是運算式,通常是搜尋指定之模式的資料行。 expression 具有字元字串資料類型類別目錄。
傳回類型
如果 expression 的資料類型是 varchar(max) 或 nvarchar(max),則為 bigint,否則為 int。
備註
如果 pattern 或 expression 是 NULL,PATINDEX 會傳回 NULL。
PATINDEX 會以輸入的定序為基礎來執行比較。 若要執行指定定序的比較,您可以利用 COLLATE,將明確定序套用至輸入。
增補字元 (Surrogate 字組)
使用 SC 定序時,傳回值會將 expression 參數中的任何 UTF-16 Surrogate 字組計算為單一字元。 如需詳細資訊,請參閱<定序與 Unicode 支援>。
0x0000 (char(0)) 是 Windows 定序中未定義的字元,而且不得包含在 PATINDEX 中。
範例
A.搭配 PATINDEX 使用模式
下列範例會尋找 ensure 模式在 AdventureWorks2012 資料庫之 Document 資料表中 DocumentSummary 資料行之特定資料列中的起始位置。
SELECT PATINDEX('%ensure%',DocumentSummary)
FROM Production.Document
WHERE DocumentNode = 0x7B40;
GO
以下為結果集:
-----------
64
(1 row(s) affected)
如果您沒有利用 WHERE 子句來限制要搜尋的資料列,查詢會傳回資料表的所有資料列,且針對找到模式的所有資料列報告非零值,找不到模式的所有資料列則會報告零。
B.搭配 PATINDEX 使用萬用字元
下列範例在指定的字串中 (索引從 1 開始),使用 % 和 _ 萬用字元來尋找模式 'en' 後面接著任何一個字元和 'ure' 的開始位置:
SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');
以下為結果集:
------------
8
PATINDEX 的運作方式就像 LIKE,所以您可以使用任何萬用字元。 您不必用百分比括住模式。 PATINDEX('a%', 'abc') 會傳回 1 且 PATINDEX('%a', 'cba') 會傳回 3。
與 LIKE 不同的是,PATINDEX 會傳回位置,類似 CHARINDEX。
C.搭配 PATINDEX 使用 COLLATE
下列範例利用 COLLATE 函數來明確指定所搜尋之運算式的定序。
USE tempdb;
GO
SELECT PATINDEX ( '%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN) ;
GO
D.使用變數來指定模式
下列範例會使用變數,將值傳遞給 pattern 參數。 這個範例會使用 AdventureWorks2012 資料庫。
DECLARE @MyValue varchar(10) = 'safety';
SELECT PATINDEX('%' + @MyValue + '%', DocumentSummary)
FROM Production.Document
WHERE DocumentNode = 0x7B40;
以下為結果集:
------------
22
請參閱
參考
[ ] (萬用字元 - 相符的字元) (Transact-SQL)
[^] (萬用字元 - 不相符的字元) (Transact-SQL)