sql server 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

SELECT SUBSTRING(‘lipasdas lip asdfa‘,CHARINDEX(‘lip‘,‘lipasdas lip asdfa‘)+3,2)
下面是这个命令输出的结果。
           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中的字符串的搜索、控制、分析很有帮助。

时间: 2024-10-02 17:27:40

sql server charindex函数和patindex函数详解(转)的相关文章

MS SQL Server:分区表、分区索引 详解

1. 分区表简介使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. ?        大型表:数据量巨大的表.?        访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式. 分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的. 注意:只能在 SQL Server Enterprise Editi

SQL Server 默认跟踪(Trace)捕获事件详解

SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_events --returns a full list of categories SELECT * FROM sys.trace_categories --returns a full list of subclass values SELECT * FROM sys.trace_subclass

SQL Server 2008 CDC增量变更捕获详解

1 背景: 随着公司业务的成长,数据量也随之的不断增长.随之而来的问题是在做ETL的时候,时间花费也越来越长.为了节省时间开销,我们只想要更新最新的数据,不想要把公司历年所有的数据都进行处理.这种情况就被称为变更数据捕获(Change Data Capture,又名CDC).在SQLServer2008之前,对数据变更的捕获通常使用触发器把DML操作中的INSERT/UPDATE/DELETE数据记录下来,但是触发器的维护比较困难:时间戳严重依赖于数据库的设计,而且必须在业务代码中对时间字段进行

SQL Server日期时间格式转换字符串详解

1.日期时间转字符串 Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006  10:57AMSelect CONVERT(varchar(100), GETDATE(), 1): 05/16/06Select  CONVERT(varchar(100), GETDATE(), 2): 06.05.16Select CONVERT(varchar(100),  GETDATE(), 3): 16/05/06Select CONVERT(var

Microsoft SQL Server中的事务与并发详解

本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一组语句要么全部成功,对数据库中的某些数据成功修改; 要么全部不成功,数据库中的数据还原到这些语句执行之前的样子. 比如网上订火车票,要么你定票成功,余票显示就减一张; 要么你定票失败获取取消订票,余票的数量还是那么多.不允许出现你订票成功了,余票没有减少或者你取消订票了,余票显示却少了一张的这种情况

SQL Server 2012 Enterprise Edition安装过程详解(包含每一步怎么设置及原因)

一.启动安装程序,点击“安装”选项卡,选择“全新SQL Server独立安装或向现有安装添加功能”.(首次安装数据库系统或向现有数据库系统添加功能,均选择此选项) 二.随后,安装程序进行“安装程序支持规则”的检测,来分析要成功安装SQL Server 2012 Enterprise Edition的前提条件是否都满足.如果存在某一个或多个条件(规则)没有通过,安装过程将无法进行,必须更正失败项才能继续.如果都满足(所有规则的状态为已通过)点击“确定”. 三.输入产品秘钥并点击“下一步”: 四.勾

SQL Server 连接字符串和身份验证详解

SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.          PropertyName1=Value1;PropertyName2=Value2;PropertyName3=Value3;.....同样,连接字符串必须包含SQL Server实例名称:          Data Source=ServerName;          使用本地的SQL Server(localhost),如果想要使用

sql server 创建内联表值函数

表值函数就是返回table 的函数使用它可以方便的进行查询的处理 创建的代码如下: create FUNCTION returunclassfirstlist(  -- Add the parameters for the function here )RETURNS TABLE ASRETURN ( -- Add the SELECT statement with parameter references here select * from classfirst;) 我们在使用创建的函数的时

SQL SERVER 提供了一些时间函数:

SQL SERVER 提供了一些时间函数:取当前时间:select getdate()取前一个月的时间:SELECT DATEADD(MONTH,-1,GETDATE()) 月份减一个月取年份:SELECT YEAR( DATEADD(MONTH,-1,GETDATE())),Year 取年份取月份:SELECT MONTH( DATEADD(MONTH,-1,GETDATE())) ,month 取月份.如上,可通过对日期函数的各种组合,来达到目标.

SQL Server 2012 新的分页函数 OFFSET & FETCH NEXT

DECLARE @page INT, @size INT;select @page = 300, @size = 10 SELECT *FROM gpcomp1.GPCUSTWHERE company like 'a%'ORDER BY CUSTNOOFFSET (@page -1) * @size ROWSFETCH NEXT @size ROWS ONLY; SQL Server 2012 新的分页函数 OFFSET & FETCH NEXT,布布扣,bubuko.com