在 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
使用 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' 结尾的电子邮件