SQL Server 中查找子串在字符串中的位置的函数PATINDEX()和CHARINDEX()

时间:2024-06-03 07:43:08

前言:

对于SQL Server中查找字符串的子串这个问题,许多人都习惯使用like,没错,但是如果出现下面情况:
查找一个表中的列中的数据是否是另一个表中一个列的数据的子串,这时由于两个列都是变量名,就无法使用like来做模糊匹配。就需要使用以下两个函数。
SQL Server中函数PATINDEX()和CHARINDEX()都是可以在一段字符串中查找子字符串位置的函数。

主要区别:是PATINDEX()支持通配符来查找,CHARINDEX()不支持通配符查找。

一、语法:

1、PATINDEX()语法格式:PATINDEX(%pattern%,expression)
pattern:是要查找的子字符串
expression:是被查找的字符串。
PATINDEX()函数返回字符或子字符串在字符串或表达式中的开始位置。
注:(1)如果在被查找字符串中出现多次子字符串,PATINDEX()函数返回的是第一次出现的位置下标。
       (2)PATINDEX()必须要用通配符,否则查询不到子字符串,见例子。

2、CHARINDEX()语法格式:CHARINDEX(pattern,expression,start_location)
pattern:是要查找的子字符串
expression:是被查找的字符串。
start_location:是charindex函数开始在expression中找pattern的起始位置
CHARINDEX()函数返回一个整数,返回子字符串在字符串或表达式中的开始位置,如果没有找到子字符串,那么函数结果为0。

二、举例说明:
1、PATINDEX()函数:

select 'SQL server2008,Hello World!' as 整个字符串,PATINDEX('Hello','SQL server2008,Hello World!') 不加通配符的结果
select 'SQL server2008,Hello World!' as 整个字符串,PATINDEX('%Hello%','SQL server2008,Hello World!') 加通配符的结果

SQL Server 中查找子串在字符串中的位置的函数PATINDEX()和CHARINDEX()

查询字符或子字符串出现多次的情况

SQL Server 中查找子串在字符串中的位置的函数PATINDEX()和CHARINDEX()

2、CHARINDEX()函数:

--1、正常查找子字符串
select 'SQL server2008,Hello World!' as 整个字符串,CHARINDEX('Hello','SQL server2008,Hello World!') 子字符串的位置下标
--2、带着起始位置的下标,那么就从起始位置开始查找要找的子字符串,那么查找o就找到World的o,而不是Hello中的o的位置下标。
select 'SQL server2008,Hello World!' as 整个字符串,CHARINDEX('o','SQL server2008,Hello World!',21) 子字符串的位置下标
--3、找不到子字符串的,返回0
select 'SQL server2008,Hello World!' as 整个字符串,CHARINDEX('server2014','SQL server2008,Hello World!') 子字符串的位置下标

SQL Server 中查找子串在字符串中的位置的函数PATINDEX()和CHARINDEX()