欢 迎 光 临 数据载入中,请稍候......'s BLog
数据载入中,请稍候......
这就是我
数据载入中,请稍候......
用户登陆
数据载入中,请稍候......
最新公告
数据载入中,请稍候......
站点日历
数据载入中,请稍候......
最新日志
数据载入中,请稍候......
最新回复
数据载入中,请稍候......
最新留言
数据载入中,请稍候......
 日志搜索

友情链接
其他信息


·sql中有时会用到的几个函数     -|cloudy 发表于 2007-11-23 14:31:00

在SQL中,left、mid这些字符串函数好象都失效了,要用substring。

在SQL中,instr函数也失效了,要用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

但charindex不支持text或ntext字段类型,不知道PATINDEX   (   '%pattern%'   ,   expression   )     怎么样?

联机帮助:  
  PATINDEX  
  返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。  
   
  语法  
  PATINDEX   (   '%pattern%'   ,   expression   )    
   
  参数  
  pattern  
   
  一个字符串。可以使用通配符,但   pattern   之前和之后必须有   %   字符(搜索第一个和最后一个字符时除外)。pattern   是短字符数据类型类别的表达式。  
   
  expression  
   
  一个表达式,通常为要在其中搜索指定模式的列,expression   为字符串数据类型类别。  
   
  返回类型  
  int  
   
  注释  
  PATINDEX   对   text   数据类型很有用;除   IS   NULL、IS   NOT   NULL   和   LIKE(这些是   WHERE   子句中对   text   类型有效的仅有的其它比较运算)外,PATINDEX   也可用于   WHERE   子句中。  
   
  如果   pattern   或   expression   为   NULL,则当数据库的兼容级别为   70   时   PATINDEX   返回   NULL;如果数据库兼容级别为   65   或更靠前,则仅当   pattern   和   expression   同时为   NULL   时,PATINDEX   返回   NULL。  
   
  示例  
  A.   在   PATINDEX   中使用模式  
  本示例查找模式"wonderful"在   titles   表中   notes   列的某一特定行中的开始位置。  
   
  USE   pubs  
  GO  
  SELECT   PATINDEX('%wonderful%',   notes)  
  FROM   titles  
  WHERE   title_id   =   'TC3218'  
  GO  
   
  下面是结果集:  
   
  -----------    
  46                      
   
  (1   row(s)   affected)  
   
  如果未通过   WHERE   子句限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值,对在其中未找到该模式的所有行报告零值。  
   
  B.   在   PATINDEX   中使用通配符  
  本示例使用通配符查找模式"won_erful"在   titles   表中   notes   列的某一特定行中的开始位置,其中下划线为代表任何字符的通配符。  
   
  USE   pubs  
  GO  
  SELECT   PATINDEX('%won_erful%',   notes)  
  FROM   titles  
  WHERE   title_id   =   'TC3218'  
  GO  
   
  下面是结果集:  
   
  ------------  
  46  
   
  (1   row(s)   affected)  
   
  如果没有限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值。

[阅读全文 | 回复(0) | 引用通告 | 编辑]

  • 标签:sql CHARINDEX substring 
  • 发表评论:
    数据载入中,请稍候......