PATINDEX仅在SQL Server和Azure SQL中可用,不支持MySQL等其他数据库;其模式需以%开头,仅支持LIKE风格通配符(如%、_、[abc]),返回1起始位置,找不到时返回0而非NULL。
PATINDEX 只在 SQL Server 和 Azure SQL 中可用,MySQL、PostgreSQL、SQLite 等不支持 —— 别在非 Microsoft 数据库里找它,会报 Invalid column name 'PATINDEX' 或直接语法错误。
PATINDEX 的模式写法和通配符规则它不是正则引擎,只支持 SQL Server 的 LIKE 风格通配符:%(任意长)、_(单字符)、[abc](字符集)、[^0-9](排除数字)等。开头必须是 %,否则匹配失败(哪怕你只想找开头的子串)。
常见错误现象:PATINDEX('abc%', @text) 永远返回 0 —— 因为没加前导 %,正确写法是 PATINDEX('%abc%', @text)。
PATINDEX('%[0-9]%', @text)
PATINDEX('%Error:%', @text)(注意前后都带 %)COLLATE SQL_Latin1_General_CP1_CS_AS
PATINDEX 返回值含义与空值处理返回的是从 1 开始的位置索引(不是 0),找不到时返回 0 —— 注意不是 NULL。所以不能用 IS NULL 判断失败,得用 = 0。
典型误用:WHERE PATINDEX('%d%', col) IS NOT NULL 永远为真(因为返回 0,不是 NULL);正确写法是 WHERE PATINDEX('%[0-9]%', col) > 0。
NULL,PATINDEX 直接返回 NULL,不是 0 —— 所以建议先 IS NOT NULL 过滤或用 ISNULL(PATINDEX(...), 0)
TEXT 类型字段,SQL Server 2016+ 已弃用,建议转为 VARCHAR(MAX) 再用PostgreSQL 用 POSITION('pattern' IN col)(仅字面匹配),或 REGEXP_MATCHES;MySQL 8.0+ 用 REGEXP_INSTR(col, 'pattern');SQLite 无内置等效函数,得靠应用层处理。
如果必须兼容多库又依赖模式搜索,别硬套 PATINDEX 思路 —— 改用标准 CHARINDEX(SQL Server)或 INSTR(MySQL/PostgreSQL)做简单子串定位,复杂模式交给应用代码解析。
CHARINDEX('abc', col) 更快,但不支持通配符PATINDEX 性能明显低于 CHARINDEX,尤其大文本 + 复杂模式时,慎用于 WHERE 条件中的高频列NOT PATINDEX 这种语法,否定逻辑只能靠 PATINDEX(...) = 0
真正容易被忽略的是排序规则影响:同一个模式在 Latin1_General_CI_AS 和 Latin1_General_CS_AS 下可能返回不同位置,尤其含大小写字母或重音字符时。上线前务必在目标环境实测。