适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统(PDW)
Microsoft Fabric 中的 SQL 分析终结点
Microsoft Fabric 中的仓库
Microsoft Fabric 中的 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。
如果表达式为 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 配合使用
以下示例在 AdventureWorks2025 数据库中表格中特定列DocumentSummaryDocument行中,找到了该模式ensure开始的位置。
SELECT PATINDEX('%ensure%', DocumentSummary) AS position
FROM Production.Document
WHERE DocumentNode = 0x7B40;
GO
结果集如下。
position
--------
64
如果不限制使用 WHERE 子句搜索的行,查询将返回表中的所有行,并报告在其中找到模式的行的非零值,对于未找到模式的所有行,则返回零。
C. 将通配符与 PATINDEX 配合使用
以下示例使用 % 和 _ 通配符查找模式 'en'(后跟任意一个字符和 'ure')在指定字符串中的开始位置(索引从 1 开始):
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. 将 COLLATE 与 PATINDEX 配合使用
以下示例使用 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