zoukankan      html  css  js  c++  java
  • TSQL语句中的Like用法

    SQL Server:SQL Like 的特殊用法

    %:匹配零个及多个任意字符; _:与任意单字符匹配; []:匹配一个范围; [^]:排除一个范围

    SymbolMeaning
    like '5[%]' 5%
    like '[_]n' _n
    like '[a-cdf]' a, b, c, d, or f
    like '[-acdf]' -, a, c, d, or f
    like '[[]' [
    like ']' ]
    like 'abc[_]d%' abc_d and abc_de
    like 'abc[def]' abcd, abce, and abcf
    like '[^1-9]' 0
    like '[^1-9b-z]' 0, a

    对于字符串中出现的特殊字符:'%','[','[]', '_' 可以使用 '[]' 把它们包含起来, 这样在匹配模式(pattern)中,它们就被当作普通字符对待了。

    1. 用 like '[[]' 匹配特殊字符 '['

    select 1 where '[ABCDE' like '[[]%'

    2. 用 like ']' 匹配特殊字符 ']'

    select 1 where ']ABCDE' like ']%'

    3. 用 like '[[]]' 匹配特殊字符 '[]'

    select 1 where '[]ABCDE' like '[[]]%%'

    4. 用 like '[_]' 匹配特殊字符 '_'

    select 1 where '_ABCDE' like '[_]%'

    5. 用 like '[%]' 匹配特殊字符 '%'

    select 1 where 'ABC%DE' like 'ABC[%]DE'

    对于其他的特殊字符:'^', '-', ']' 因为它们本身在包含在 '[]' 中使用,所以需要用另外的方式来转义,于是就引入了 like 中的 escape 子句,另外值得注意的是:escape 可以转义所有的特殊字符

    select 1 where '^ABCDE' like '!^ABCDE' escape '!'
    select 1 where '-ABCDE' like '!-ABCDE' escape '!'
    select 1 where ']ABCDE' like '!]ABCDE' escape '!'
    
    select 1 where '%ABCDE' like '\%ABCDE' escape '\'
    select 1 where '%ABCDE' like '!%ABCDE' escape '!'
    select 1 where '%ABCDE' like '#%ABCDE' escape '#'
    select 1 where '%ABCDE' like '@%ABCDE' escape '@'
    
    select 1 where '[ABCDE' like '![ABCDE' escape '!'
    select 1 where ']ABCDE' like '!]ABCDE' escape '!'

    看出规律了吧,就是用 escape 后面紧跟着的字符来做转义字符。 escape 后面的字符相当于 C 语言字符串中的转义字符 '\'。

    最后,看一个更加复杂的匹配

    select 1 where '[^A-Z]ABCDE' like '\[\^A\-Z\]%' escape '\'

    以上转载自:http://www.sqlstudy.com/sql_article.php?id=2008061601

    SQL 通配符

    在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

    SQL 通配符必须与 LIKE 运算符一起使用。

    在 SQL 中,可使用以下通配符:

    通配符描述
    % 替代一个或多个字符
    _ 仅替代一个字符
    [charlist] 字符列中的任何单一字符

    [^charlist]

    或者

    [!charlist]

    不在字符列中的任何单一字符

    原始的表 (用在例子中的):

    Persons 表:

    IdLastNameFirstNameAddressCity
    1 Adams John Oxford Street London
    2 Bush George Fifth Avenue New York
    3 Carter Thomas Changan Street Beijing

    使用 % 通配符

    例子 1

    现在,我们希望从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人:

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE City LIKE 'Ne%'

    结果集:

    IdLastNameFirstNameAddressCity
    2 Bush George Fifth Avenue New York

    例子 2

    接下来,我们希望从 "Persons" 表中选取居住在包含 "lond" 的城市里的人:

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE City LIKE '%lond%'

    结果集:

    IdLastNameFirstNameAddressCity
    1 Adams John Oxford Street London

    使用 _ 通配符

    例子 1

    现在,我们希望从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人:

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE FirstName LIKE '_eorge'

    结果集:

    IdLastNameFirstNameAddressCity
    2 Bush George Fifth Avenue New York

    例子 2

    接下来,我们希望从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er":

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'

    结果集:

    IdLastNameFirstNameAddressCity
    3 Carter Thomas Changan Street Beijing

    使用 [charlist] 通配符

    例子 1

    现在,我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE City LIKE '[ALN]%'

    结果集:

    IdLastNameFirstNameAddressCity
    1 Adams John Oxford Street London
    2 Bush George Fifth Avenue New York

    例子 2

    现在,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:

    我们可以使用下面的 SELECT 语句:

    SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

    结果集:

    IdLastNameFirstNameAddressCity
    3 Carter Thomas Changan Street Beijing

    以上转载自:http://www.w3school.com.cn/sql/sql_wildcards.asp

    笔者代码:

    实现需求:匹配并获取表格中第二列出现过某特殊字符的所有行。

    代码:

    create table #tbl(k int,v nvarchar(30))
    insert into #tbl 
        select 1,'1+中为1+2' union select 2,'1+中为+1' union select 3,'中为' union select 4,'中为+1'
    
    declare @x1 nvarchar(30)
    set @x1 = '中为'
    
    declare @prefix nvarchar(20)
    set @prefix = '[+!-*/()[!]<>,]'

    select * from #tbl where (v like '%'+@prefix+@x1+@prefix+'%' escape '!') or (v like @x1+@prefix+'%' escape '!') or (v like '%'+@prefix+@x1 escape '!') or (v = @x1) drop table #tbl

    执行结果为:

    2 1+中为+1
    3 中为
    4 中为+1

    技术有限,本例中的查询语句后面的where语句用了三个or,只为匹配开头和结尾的特殊字符,代码比较笨重,同时会增加系统的开销。如果更好的实现方法,望多多指教!

  • 相关阅读:
    算法:最大回文子串问题
    Python HTTP库requests中文页面乱码解决方案!
    Python:默认参数
    在博客园开通个人博客了
    JQ选择器
    C# 接口
    C# 微信公众平台开发(2) 微信菜单
    C# 微信公众平台开发(1) 服务器配置
    博客园开博第一天!记录生活,扬帆启航!
    JavaScript判断、循环、Map、Set
  • 原文地址:https://www.cnblogs.com/icyJ/p/TSQL_Like.html
Copyright © 2011-2022 走看看