zoukankan      html  css  js  c++  java
  • [转]模糊查询(LIKE)and (PATINDEX() . CHARINDEX())

    SQL中的模糊查询
    一般来说使用模糊查询,大家都会想到LIKE  
    select * from table where a like '%字符%'  

    如果一个SQL语句中用多个 like模糊查询,并且记录条数很大,那速度一定会很慢。  

    下面两种方法也可实现模糊查询:  
    select * from table where patindex('%字符%',字段名)>0  
    select * from table where charindex('字符',字段名)>0  


    其中,>0表示:字符在字段中存在
    经测试这两种方法比LIKE速度要快。

    总结

          你现在可以发现CHARINDEX和PATINDEX搜索字符串时的区别了吧。PATINDEX函数支持使用通配符,可以用在很多有变化的查找中。而CHARINDEX不可以。根据你自己不同的情况,这两个函数对你在SQL Server中的字符串的搜索、控制、分析很有帮助

    如下是详细的解释:

    SQL Server CHARINDEX和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', '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
     

    From : http://www.cnblogs.com/a2008a/archive/2008/11/14/1333299.html

  • 相关阅读:
    101. Symmetric Tree(js)
    100. Same Tree(js)
    99. Recover Binary Search Tree(js)
    98. Validate Binary Search Tree(js)
    97. Interleaving String(js)
    96. Unique Binary Search Trees(js)
    95. Unique Binary Search Trees II(js)
    94. Binary Tree Inorder Traversal(js)
    93. Restore IP Addresses(js)
    92. Reverse Linked List II(js)
  • 原文地址:https://www.cnblogs.com/Googler/p/1873704.html
Copyright © 2011-2022 走看看