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