`
lovexuwenhao
  • 浏览: 197205 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL CHARINDEX和PATINDEX函数

阅读更多

CHARINDEX和PATINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。PATINDEX函数支持使用通配符来进行搜索,然而CHARINDEX不支持通佩符。接下来,我们逐个分析这两个函数。
如何使用CHARINDEX函数
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。
接下来,我们看这个CHARINDEX命令: CHARINDEX('7.0',   'Microsoft   SQL   Server   2000')
   
在这个例子中,CHARINDEX返回零,因为字符串“7.0”   不能在“Microsoft   SQL   Server”中被找到。接下来通过两个例子来看看如何使用CHARINDEX函数来解决实际的T-SQL问题。
   
第一个例子,假设你要显示Northwind数据库Customer表前5行联系人列的Last   Name。这是前5行数据
ContactName
------------------------------   
Maria   Anders
Ana   Trujillo
Antonio   Moreno
Thomas   Hardy
Christina   Berglund
   
你可以看到,CustomName包含客户的First   Name和Last   Name,它们之间被一个空格隔开。我用CHARINDX函数确定两个名字中间空格的位置。通过这个方法,我们可以分析ContactName列的空格位置,这样我们可以只显示这个列的last   name部分。这是显示Northwind的Customer表前5行last   name的记录!
   
select   top   5   substring(ContactName,charindex('   ',ContactName)+1   ,
len(ContactName))   as   [Last   Name]   from   Northwind.dbo.customers
  
下面是这个命令输出的结果。
Last   Name
------------------------------   
Anders
Trujillo
Moreno
Hardy
Berglund
  
          CHARINDEX函数找到First   Name和Last   Name之间的空格,所以SUBSTRING函数可以分开ContactName列,这样就只有Last   Name被选出。我在CHARINDEX函数返回的整数上加1,这样Last   Name不是从空格开始。
  
          在第二个例子中,即如说你要计算记录中,某一个字段包含特定字符的所有记录数。CHARINDEX函数可以方便的解决你的问题。
计算 Northwind.dbo.Customer表中Addresses字段中包含单词Road或者它的缩写Rd的记录数,选择语句类似这样:
  
                SELECT   count(*)   from   Northwind.dbo.Customers   
                WHERE   CHARINDEX('Rd',Address)   >   0   or   CHARINDEX('Road',Address)>   1   
  
如何使用PATINDEX函数
  
          PATINDEX函数返回字符或者字符串在另一个字符串或者表达式中的起始位置,,PATINDEX函数支持搜索字符串中使用通配符,这使PATINDEX函数对于变化的搜索字符串很有价值。
PATINDEX函数的命令如下:
  
          PATINDEX   (   '%pattern%'   ,   expression   )

  
          Pattern是你要搜索的字符串,expression是被搜索的字符串。一般情况下expression是一个表中的一个字段,pattern的前后需要用“%”标记,除非你搜索的字符串在被收缩的字符串的最前面或者最后面。
  
          和CHARINDEX函数一样,PATINDEX函数返回搜索字符串在被搜索字符串中的起始位置。假如有这样一个PATINDEX函数:
  
         PATINDEX('%BC%','ABCD')
  
          这个PATINDEX函数返回的结果是2,这和CHARINDEX函数一样。这里的%标记告诉PATINDEX函数去找字符串“BC”,不管被搜索的字符串中在“BC”的前后有多少字符!
          假如你想知道被搜索字符串是否由特定的字符串开始,你可以省去前面的%标记。PATINDED函数就要这样写:
  
          PATINDEX('AB%','ABCD')
  
          这个命令执行的结果返回1,表示搜索的字符串“AB”在被搜索的字符串中“ABCD”被找到。
  
          使用通配符可以编辑比我以上举得简单例子复杂得多的搜索字符串。假如说你要确定一个字符串是否包含字母A和Z,还有任何数字,这个PARINDEX函数命令可能像这样:
  
          PATINDEX('%[A,Z,0-9]%[A,Z,0-9]%[A,Z,0-9]%','XYZABC123')
  
          注意在上面这个例子中的搜索字符部分使用了很多的通陪符。察看SQL   Server联机丛书可以获得更多关于通佩符的信息。接下来,我们用两个例子来看PATINDEX和SELECT怎么联合起来使用。
    
          假设你想要找出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     
  
总结
  
          你现在可以发现CHARINDEX和PATINDEX搜索字符串时的区别了吧。PATINDEX函数支持使用通配符,可以用在很多有变化的查找中。而 CHARINDEX不可以。根据你自己不同的情况,这两个函数对你在SQL   Server中的字符串的搜索、控制、分析很有帮助。

分享到:
评论

相关推荐

    SQLserver中字符串查找功能patindex和charindex的区别

    包括 1、全匹配查找字符串 2、模糊查找字符串 CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置。PATINDEX 可使用通配符,而 CHARINDEX 不可以。 这两个函数都带有2个参数: 1 希望获取其位置的模式。使用 ...

    sqlserver 中charindex/patindex/like 的比较

    sqlserver 中charindex/patindex/like 的比较,大家可以看下根据需要自行选择。

    sqlserver中常用函数

    sqlserver中常用函数----字符串函数---- ASCII() --函数返回字符表达式最左端字符的ASCII 码值 CHAR() --函数用于将ASCII 码转换为字符 --如果没有输入0 ~ 255 之间的...CHARINDEX(),PATINDEX() --函数返回字符串

    sqlserver自定义函数

    set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'') end return end select * from dbo.f_splitstr('1,2,3,4',',') --全角和半角转换函数 Create FUNCTION f_Convert( @str ...

    sqlserver数据库常用函数

    3.CHARINDEX 39 4.DIFFERENCE 41 5.LEFT 42 6.LEN 43 7.LOWER 44 8.LTRIM 45 9.NCHAR 46 10.PATINDEX 49 11.REPLACE 51 12.QUOTENAME 52 13.REPLICATE 53 14.REVERSE 56 15.RIGHT 57 16.RTRIM 59 17.SOUNDEX 60 18....

    SQL中字符串中包含字符的判断方法

    在sql中我判断包含字符串我们可使用很多方法,如like,replace,charindex函数都可实现我们要的功能,下面我来给各位介绍判断字符串包含字符串sql语句。 通过2个函数CHARINDEX和PATINDEX以及通配符的灵活使用 函数:...

    SQL函数

    根据ascii吗取字符 字符串查找 charindex(char_expr,expression) 返回char_expr的起始位置 patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 2.数学函数 abs(numeric_expr) 求...

    sql常用函数

    substring(),charindex(),PATINDEX(),convert(),case when then end,cast(),ISNULL(),Len(),Replace(),Right()

    SqlServer类似正则表达式的字符处理问题

    SQL Serve提供了简单的字符模糊匹配功能,比如:like, patindex,不过对于某些字符处理场景还显得并不足够,日常碰到的几个问题有: 1. 同一个字符/字符串,出现了多少次 2. 同一个字符,第N次出现的位置 3. 多个...

Global site tag (gtag.js) - Google Analytics