仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 902|回复: 8
打印 上一主题 下一主题

[学习教程] CHARINDEX和PATINDEX

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:19:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT<p>SQLServerCHARINDEX和PATINDEX详解
假设你写过良多程序,你大概偶然会碰着要断定字符或字符窜串否包括在一段笔墨中,在这篇文章中,我将会商利用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’,’MicrosoftSQLServer’)
这个函数命令将前往在“MicrosoftSQLServer”中“SQL”的肇端地位,在这个例子中,CHARINDEX函数将前往“S”在“MicrosoftSQLServer”中的地位11。
接上去,我们看这个CHARINDEX命令:
CHARINDEX(’7.0’,’MicrosoftSQLServer2000’)
在这个例子中,CHARINDEX前往零,由于字符串“7.0”不克不及在“MicrosoftSQLServer”中被找到。接上去经由过程两个例子来看看怎样利用CHARINDEX函数来办理实践的T-SQL成绩。
第一个例子,假定你要显现Northwind数据库Customer表前5行接洽人列的LastName。这是前5行数据
ContactName
------------------------------
MariaAnders
AnaTrujillo
AntonioMoreno
ThomasHardy
ChristinaBerglund
你能够看到,CustomName包括客户的FirstName和LastName,它们之间被一个空格离隔。我用CHARINDX函数断定两个名字两头空格的地位。经由过程这个办法,我们能够剖析ContactName列的空格地位,如许我们能够只显现这个列的lastname部分。这是显现Northwind的Customer表前5行lastname的纪录!
selecttop5substring(ContactName,charindex(’’,ContactName)+1,
len(ContactName))as[LastName]fromNorthwind.dbo.customers
上面是这个命令输入的了局。
LastName
------------------------------
Anders
Trujillo
Moreno
Hardy
Berglund
CHARINDEX函数找到FirstName和LastName之间的空格,以是SUBSTRING函数能够分隔ContactName列,如许就只要LastName被选出。我在CHARINDEX函数前往的整数上加1,如许LastName不是从空格入手下手。
在第二个例子中,即如说你要盘算纪录中,某一个字段包括特定字符的一切纪录数。CHARINDEX函数能够便利的办理你的成绩。盘算Northwind.dbo.Customer表中Addresses字段中包括单词Road大概它的缩写Rd的纪录数,选择语句相似如许:
SELECTcount(*)fromNorthwind.dbo.Customers
WHERECHARINDEX(’Rd’,Address)>0orCHARINDEX(’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’)
注重在下面这个例子中的搜刮字符部分利用了良多的通陪符。观察SQLServer联机丛书能够取得更多关于通佩符的信息。接上去,我们用两个例子来看PATINDEX和SELECT怎样团结起来利用。

假定你想要找出Northwind.dbo.Categories表中Description字段中是包括单词“Bread”或“bread”的一切纪录,那末选择语句便可能是如许:
SELECTDescriptionfromNorthwind.dbo.Categories
WHEREpatindex(’%[b,B]read%’,description)>0
这里我用通配符来断定年夜写和小写的“b”。我在Notthwind数据库中实行这个剧本后,失掉上面的了局:
Description
--------------------------------------------------------
Desserts,candies,andsweetbreads
Breads,crackers,pasta,andcereal
这是再用别的一个分外的通配符来查找一些纪录的例子。这个例子是怎样选出下面的查询了局中,Description字段的第二子字母不是“e”的记录。
selectDescriptionfromNorthwind.dbo.Categories
&nbsp导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。
乐观 该用户已被删除
沙发
发表于 2015-1-18 12:55:40 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-26 08:57:30 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
海妖 该用户已被删除
地板
发表于 2015-2-4 15:55:11 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
若相依 该用户已被删除
5#
发表于 2015-2-10 03:49:16 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
简单生活 该用户已被删除
6#
发表于 2015-2-28 18:54:28 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
小魔女 该用户已被删除
7#
发表于 2015-3-10 06:06:39 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
活着的死人 该用户已被删除
8#
发表于 2015-3-17 05:10:31 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
灵魂腐蚀 该用户已被删除
9#
发表于 2015-3-23 22:38:50 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-27 20:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表