sqlserver 中charindex、patindex、like 的比较

发布于:2024-10-17 ⋅ 阅读:(92) ⋅ 点赞:(0)

        在 SQL Server 中,CHARINDEX、PATINDEX 和 LIKE 都是用于字符串匹配和搜索的函数或操作符,但它们各自有不同的用途和特点。下面是它们之间的比较:

1. CHARINDEX

•功能:CHARINDEX 函数用于返回一个子字符串在另一个字符串中的起始位置。

•语法:

CHARINDEX(substring, string [, start_location])

•参数:

        •substring:要查找的子字符串。

        •string:要在其中查找子字符串的主字符串。•start_location(可选):开始搜索的位置,默认为1。

•返回值:如果找到子字符串,则返回其在主字符串中的起始位置(从 1 开始计数);如果没有找到,则返回 0。

•示例:

SELECT CHARINDEX('world', 'Hello world!'); -- 返回 7

2. PATINDEX

•功能:PATINDEX 函数用于返回一个模式在另一个字符串中的起始位置。与 CHARINDEX 不同的是,PATINDEX 可以使用通配符进行模式匹配。

•语法:

PATINDEX('%pattern%', string)

•参数:

        •%pattern%:包含通配符的模式。

        •string:要在其中查找模式的主字符串。

•返回值:如果找到模式,则返回其在主字符串中的起始位置(从 1 开始计数);如果没有找到,则返回 0。

•示例:

SELECT PATINDEX('%o_w%', 'Hello world!'); -- 返回 8

3. LIKE

•功能:LIKE 操作符用于在 WHERE 子句中进行模式匹配。它支持通配符来匹配特定的模式。

•语法:

column_name LIKE pattern

•通配符:

        •%:匹配任意长度的字符(包括空字符)。

        •_:匹配单个字符。•[charlist]:匹配方括号内的任意一个字符。

        • 或 [!charlist]:匹配不在方括号内的任意一个字符。

•返回值:LIKE 通常用于 WHERE 子句中,返回满足条件的行。

•示例:

SELECT * FROM employees WHERE first_name LIKE 'J%'; -- 返回所有以 J 开头的名字
SELECT * FROM employees WHERE first_name LIKE '_ohn'; -- 返回所有第二个字母是 o 且名字长度为 4 的名字

比较

•精确匹配 vs 模式匹配:•CHARINDEX 用于精确匹配子字符串。

•PATINDEX 用于模式匹配,支持通配符。

•LIKE 也用于模式匹配,支持通配符,并且通常用于 WHERE 子句中进行过滤。

•返回值:

•CHARINDEX 和 PATINDEX 返回子字符串或模式在主字符串中的起始位置。

•LIKE 通常用于 WHERE 子句中,返回满足条件的行。

•性能:

•CHARINDEX 和 PATINDEX 在处理简单的子字符串匹配时可能比 LIKE 更快。

•LIKE 在处理复杂的模式匹配时更灵活,但在某些情况下可能会导致性能问题,特别是在没有合适索引的情况下。

示例假设有一个表 employees,包含以下列:

•employee_id

•first_name

•last_name

•email

使用 CHARINDEX

SELECT * 
FROM employees
WHERE CHARINDEX('@', email) > 0; -- 查找所有包含 '@' 的电子邮件

使用 PATINDEX

SELECT * 
FROM employees
WHERE PATINDEX('%@example.com%', email) > 0; -- 查找所有包含 '@example.com' 的电子邮件

使用 LIKE

SELECT * 
FROM employees
WHERE email LIKE '%@example.com'; -- 查找所有以 '@example.com' 结尾的电子邮件