SQL中patindex函数的使用说明

作者:袖梨 2022-06-29

charindex函数返回字符或字符串在另一个字符串中的起始位置。charindex函数调用方法如下:

charindex ( expression1 , expression2 [ , start_location ] )

expression1是要到expression2中寻找的字符中,start_location是charindex函数开始在expression2中找expression1的位置。

charindex函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如charindex没有找到要找的字符串,那么函数整数“0”。让我们看看下面的函数命令执行的结果:

charindex(sql, microsoft sql server)

这个函数命令将返回在“microsoft sql server”中“sql”的起始位置,在这个例子中,charindex函数将返回“s”在“microsoft sql server”中的位置11。例如:

 代码如下 复制代码

select charindex('a',username) fromz_user

patindex ( %pattern% , expression )

pattern是您要搜索的字符串,expression是被搜索的字符串。一般情况下expression是个表中的一个字段,pattern的前后需要用“%”标记,除非您搜索的字符串在被收缩的字符串的最前面或最后面。

和charindex函数相同,patindex函数返回搜索字符串在被搜索字符串中的起始位置。假如有这样一个patindex函数:

 代码如下 复制代码

patindex(%bc%,abcd)

这个patindex函数返回的结果是2,这和charindex函数相同。这里的%标记告诉patindex函数去找字符串“bc”,不管被搜索的字符串中在“bc”的前后有多少字符!例如:

 代码如下 复制代码

select patindex('%a%',username) from z_user


数的具体用法:

 

1. PATINDEX ( '%pattern%' , expression )


'%pattern%'的用法类似于 like '%pattern%'的用法,也就是模糊查找其pattern字符串是否是expression找到,找到并返回其第一次出现的位置。

如:

 代码如下 复制代码

select patindex('%abb%','abcaabbeeabb')

结果5,也就是abb第一次出现的位置。

 

 代码如下 复制代码
2.PATINDEX ( '%pattern' , expression )


'%pattern' 类似于 like '%pattern'的用法,前面用模糊查找,也就是查找pattern的结束所在expression的位置,也就是从后面匹配起查找。

如:

select patindex('%abb','abcaabbeeabb')

返回10,也就是abb在后面第一次出现的位置。

select patindex('%abb','abcaabbeeabbr')

返回0,后面的第一个字母r和abb不匹配,所以返回0

 
3.PATINDEX ( 'pattern%' , expression )


'pattern%'类似于 like 'pattern%'也就前面用精确查找,后面模糊查找,也就相当于查询pattern首次出现的位置。

如:

select patindex('abb%','abbcaabbeeabb')

返回1,也就相当于起始值

select patindex('abb%','arbbcaabbeeabb')

返回0,开头找不到就返回0,后面无论有多少都不管。

 
4.PATINDEX ( 'pattern' , expression )


这就相当于精确匹配查找,也就是pattern,expression完全相等。

如:

select patindex('abb','abb')

返回1,完全相等

select patindex('abb','abbr')

返回0,不完全相等

 
5. patindex('%[pattern]%','ddabcaabbeeabbr'),

    patindex('%[^pattern]%','ddabcaabbeeabbr')

在此先说[]的用法,[]是指定某些特殊的字符。[^]除[]之外的字符串,[]这其中的每一个。

如:

 代码如下 复制代码

Symbol Meaning

LIKE '5[%]' 5%

LIKE '[_]n' _n

LIKE '[a-cdf]' a, b, c, d, or f

LIKE '[-acdf]' -, a, c, d, or f

LIKE '[ [ ]' [

LIKE ']' ]

LIKE 'abc[_]d%' abc_d and abc_de

LIKE 'abc[def]' abcd, abce, and abcf

 

实例如:

 

 代码如下 复制代码

select patindex('%[d]%','rcrdsddddaadadffdr')

返回4,[]中d在字符串rcrdsddddaadadffdr的第一次出现的位置。

 

 代码如下 复制代码

select patindex('%[cd]%','rcrdsdddrdaadadffdr')

返回2,[]中c,d在其中一个的位置,返回最先出现的这个位置,c在此字符串里第一次出现位置是2,而d是4,结果取最先的那个。

 

 代码如下 复制代码

select patindex('%[sd]%','rcrdsdddrdaadadffdr')

返回4,[]中c,d在其中一个的位置,返回最先出现的这个位置,s在此字符串里第一次出现位置是5,而d是4,结果取最先的那个。

 

 代码如下 复制代码

select patindex('%[^r]%','rrrdsdddrdaadadffdr')

返回4,除[]中的字符串的匹配字符,第一次出现d不在[^r]里,所以就找到第一次这位。

 

 代码如下 复制代码

select patindex('%[^rd]%','rrrdsdddrdaadadffdr')

返回5,除[]中的字符串的匹配字符,第一次出现s不在[^rd]里,所以就找到第一次这位。

 代码如下 复制代码

 

select patindex('%[^rsd]%','rrrdsdddrdaadadffdr')

返回11,除[]中的字符串的匹配字符,第一次出现a不在[^rsd]里,所以就找到第一次这位。


假设你想要找出Northwind.dbo.Categories表中Description字段中是包含单词“Bread”或“bread”的所有记录,那么选择语句就可能是这样:

 代码如下 复制代码
        SELECT Description from Northwind.dbo.Categories
        WHERE patindex('%[b,B]read%',description) > 0

     这里我用通配符来确定大写和小写的“b”。我在Notthwind数据库中执行这个脚本后,得到下面的结果:
           Description
            --------------------------------------------------------
            Desserts, candies, and sweet breads
            Breads, crackers, pasta, and cereal
    这是再用另外一个额外的通配符来查找一些记录的例子。这个例子是如何选出上面的查询结果中,Description字段的第二子字母不是“e”的纪录。
              

 代码如下 复制代码
     select Description from Northwind.dbo.Categories    
                   where patindex('%[b,B]read%',description) > 0 
                   and patindex('_[^e]%',description) = 1     

   
    通过在条件语句中增加一个使用^通配符的PATINDEX函数,我们可以过滤掉“Dessert, candies, and sweet breads”这条记录。上面的查询结果只有一条记录。
           Description
           --------------------------------------------------------
           Breads, crackers, pasta, and cereal

相关文章

精彩推荐