葡京网投哪个正规 > 新葡亰-数据 > 中的通配符,有些正则表达式可以通过like实现

原标题:中的通配符,有些正则表达式可以通过like实现

浏览次数:192 时间:2020-05-07

mssql like 查询字符

原文发布时间为:2010-10-28 —— 来源于本人的百度文章 [由搬家工具导入]

Access,MS SQL Server 和 Oracle 中使用的通配符如果有什么不同,主要就是因为支持的 SQL 规范不同。SQL 语言发 布过两个规范:ANSI-89 和 ANSI-92。跟 ANSI-89 比起来,ANSI-92 SQL 有新的和不同的保留关键字,语法规则和通配符(Wildcard)。虽然是两个规范,并不表示支持哪个都好,ANSI-92 实际上是要替换 ANSI-89 的,正如ANSI-89 替换了之前并不广为所知的 ANSI  X3.135-1986。

语法match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

在SQL结构化查询语言中,LIKE语句有着至关重要的作用。
LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。
假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记录,语句如下:
select * from table1 where name like "张*"
如果要查询以“张”结尾的记录,则语句如下:
select * from table1 where name like "*张"
这里用到了通配符“*”,可以说,like语句是和通配符分不开的。下面我们就详细介绍一下通配符。

Access,MS SQL 和 Oracle 发展到今天也不知道经过多少版本了(遑论其它非主流的数据库系统),支持的 SQL 规 范当然也是与时俱进。有时候,我们说 Access 中的通配符和 MS SQL,和 Oracle 不一样,实际上是在拿一个比较老的 Access 版本和一个比较新的 MS SQL 作比较,因为支持最新的 SQL 规范是数据库系统程序发展的一个趋势,没道理对新规范视而不见,失去客户和市场吧(可以参照 SONY 在 MP3 规格上的失利)。换而言之,Access,MS SQL 和 Oracle 中的 SQL 语法将来应该是趋向一致的,没有那么大的差异。其实,Access 2003 就已经向 ANSI-92 SQL 靠拢了。

参数match_expression

匹配类型  
模式
举例 及 代表值
说明

除了支持的 SQL 规范不同,还有些不同就是开发商自己定义的那部分了。对 SQL 规范的实现,或者这里减一点,或者那里加一点,没有说一定要忠实某个标准。不过对用户来说,切换产品的时候就有必要了解都有哪些不同点和共同点,还不能做 到完全无缝衔接。比如 Microsoft 的 Jet SQL,虽然是参照 ANSI 标准的,到底夹带了很多自己的东西,保留关键字和数据类型都不一样,可以参考以下链接: Equivalent ANSI SQL Data Types Microsoft Jet Database Engine SQL Reserved Words Microsoft Jet Database Engine SQL Data Types

任何字符串数据类型的有效 SQL Server 表达式。

多个字符
*
c*c代表cc,cBc,cbc,cabdfec等
它同于DOS命令中的通配符,代表多个字符。

Access 中查找处理数据的方法基本上可以分为两大类:点 Edit 菜单调出来的 Find and Replace 对话框;和用 SQL 语句编写的选择或动作查询。在 Access 2003 数据库(.mdb) 文件中, Find and Replace 对话框和 SQL 语句编写的查询使用的规范是一致的,安装时的默认项是 ANSI-89 规范,我们可以自定义为 ANSI-92 规范。在 Access 2003 版程序中,我们可以配置数据库文件支持任意一种规范。但在 Access 2000 版程序中,只能用 ANSI-89。

pattern

多个字符
%
%c%代表agdcagd等
这种方法在很多程序中要用到,主要是查询包含子串的。

ANSI-89 通配符集

match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

特殊字符
[*]
a[*]a代表a*a
代替*

通配符 描述 例子
* 匹配任意数量的字符。星号可以写在字符串的任意位置。 wh* 可以查到 what,white 和 why,但查不到 awhile 或 watch。
? 匹配任意单个的字符。 B?ll 可查到 ball,bell 和 bill。
[ ] 匹配方括号里的任意单个字符。 B[ae]ll 可查到 ball 和 bell,但不能查到 bill。
! 匹配任意不在方括号里的字符。 b[!ae]ll 可查到 bill 和 bull,但不能查到 ball 或 bell。
- 匹配某个字符范围内的任意一个字符,字符范围必须以升序方式表示 (即 A 到 Z,不能为 Z 到 A)。 b[a-c]d 可查到 bad,bbd 和 bcd。
# 匹配任意单个的数字。 1#3 可查到 103,113,123

通配符 描述 示例 % 包含零个或更多字符的任意字符串。 WHERE title LIKE '%computer%' 将查找处于

单字符
?
b?b代表brb,bFb等
同于DOS命令中的?通配符,代表单个字符

ANSI-92 通配符集

书名任意位置的包含单词 computer 的所有书名。 _ 任何单个字符。 WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所

单数字
#
k#k代表k1k,k8k,k0k
大致同上,不同的是代只能代表单个数字。

通配符 描述 示例
% 匹配任意数量的字符。可以写在字符串的开头和结尾。 wh% 可查到 what,white 和 why,但不能查到 awhile 或 watch。
_(下划线) 匹配任意单个字符。 B_ll 可查到 ball,bell和 bill。
[ ] 匹配方括号里的任意单个字符。 B[ae]ll 可查到 ball 和 bell,但查不到 bill。
^ 匹配不在方括号里的任意字符。 b[^ae]ll 可查到 bill 和 bull,但查不到 ball 或 bell。
-(连线) 匹配某个字符范围内的任意一个字符,字符范围必须以升序方式表示 (即 A 到 Z,不能为 Z 到 A)。 b[a-c]d 可查到 bad,bbd 和 bcd。

有 4 个字母的名字。 [ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname

字符范围

注意

LIKE '[C-P]arsen' 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的

  • [a-z]代表a到z的26个字母中任意一个 指定一个范围中任意一个
    续上
    排除 [!字符] [!a-z]代表9,0,%,*等 它只代表单个字符
    数字排除 [!数字] [!0-9]代表A,b,C,d等 同上
    组合类型 字符[范围类型]字符 cc[!a-d]#代表ccF#等 可以和其它几种方式组合使用
    假设表table1中有以下记录:
    name                          sex
    张小明              男
    李明天       男
    李a天       女
    王5五       男
    王清五           男
    下面我们来举例说明一下:
    例1,查询name字段中包含有“明”字的。
    select * from table1 where name like '%明%'
    例2,查询name字段中以“李”字开头。
    select * from table1 where name like '李*'
    例3,查询name字段中含有数字的。
    select * from table1 where name like '%[0-9]%'
    例4,查询name字段中含有小写字母的。
    select * from table1 where name like '%[a-z]%'
    例5,查询name字段中不含有数字的。
    select * from table1 where name like '%[!0-9]%'
    以上例子能列出什么值来显而易见。但在这里,我们着重要说明的是通配符“*”与“%”的区别。
    很多朋友会问,为什么我在以上查询时有个别的表示所有字符的时候用"%"而不用“*”?先看看下面的例子能分别出现什么结果:
    select * from table1 where name like *明*
    select * from table1 where name like %明%
    大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,
    所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。
  • 要在数据中查找通配符本身,用方括号把要找的字符括起来,比如  [#] 。星号(*),问号(?),井号(#),开方括号( [) 和连线号(-) 都是如此。查找感叹号(!) 或闭方括号 (])时不要用方括号括起来。用 Find and Replace 对话框来查找通配符本身时,只 需在 Find What 文本框里输入字符,不要用方括号括起来。用查询来做也是如此,例如 Like "*!*" 返回包含感叹号的所有记录。可以参考以下链接:

    Find wildcard characters in an Access database.

    如果你同时找连线号和其它字符,在方括号里把连线号放在所有其它字符的前面或后面,例如 [-#*][#*-]。但是, 如果在开方括号后面有感叹号的话,要把连线号放在感叹号后面 [!-]

  • 要查找开闭一对方括号 ([]),必须要把两个符号都放在方括号里,像这个样子 [[]] 。因为只写一对方括号的话,Access 会把它理解为零长字符串。要输入零长字符串,打上两个双引号,中间不能有空格。

作者姓氏,例如,Carsen、Larsen、Karsen 等。 [^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname

========语法==========
LIKE   

可以用通配符搜索的数据类型

LIKE 'de[^l]%' 将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用   =   和   !=   字符串比较运算符相比,使用通配符可使   LIKE   运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft®   SQL   Server™   会将其转换成字符串数据类型(如果可能)。

在某些情况下,我们在 Find and Replace 对话框中可以使用通配符,但在查询语句中不能用。反之亦然。

escape_character

语法
match_expression   [   NOT   ]   LIKE   pattern   [   ESCAPE   escape_character   ]

数据类型 通配符用在……
Text Find and Replace 对话框,查询语句
Memo Find and Replace 对话框,查询语句
Number Find and Replace 对话框,查询语句
Date/Time Find and Replace 对话框,查询语句 注意:区域设置会影响通配符的使用,请看下面的信息。
Currency Find and Replace 对话框,查询语句
AutoNumber Find and Replace 对话框,查询语句
OLE Object
Yes/No 查询语句。但是不需要用通配符,请看下面的信息。
Hyperlink Find and Replace 对话框,查询语句
Lookup Wizard 依赖于源字段的数据类型。

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。

参数
match_expression   任何字符串数据类型的有效   SQL   Server   表达式。
patternmatch_expression   中的搜索模式,可以包含下列有效   SQL   Server   通配符

注意

escape_character 没有默认值,且必须仅包含一个字符。

1       %     包含零个或更多字符的任意字符串
示例:WHERE   title   LIKE   '%computer% '     将查找处于书名任意位置的包含单词   computer   的所有书名。

  • 日期/时间(Date/Time)类型的字段应用的格式如果能把时间以文本的方式显示出来,我们就能凭我们看到的在 Find and Replace 对话框里输入通配符进行查找。我们不用关心这个类型实际存储的数值,通配符匹配 的是我们看到的东西,这也就是 Search Fields as Formatted 选项的意义,默认是勾上的。还要记住的是,控制面板里的区域设置会影响我们看到的格式和搜索的方式。比如,Access 可能会把部分日期显示为罗马数字,例如 07-IX-1997,表示 07-Sept-1997。我们搜索的时候,要以我们看到的为准则,这是规律。例如,我们输入 *-IX-1997 就可以查到 1997年 9月的所有记录。

    另外,如果日期字段显示的文本包含发音符号,比如áä, 我们必须在准则字符串里包括这些发音符号,否则检索不会成功。我们可以用通配符绕过输入这些发音符号。例如,有一个日期 格式 3-heinä-1997,我们的查询字符串可以写成 *-hein*-1997.

  • 如果试图用 Find and Replace 对话框搜索 Yes/No 字段,Access 会禁用该字段,对话框不 返回任何结果。如果用查询语句搜索 Yes/No 字段,则可以使用通配符。但记住,Yes/No 字段只返回两个值(0 是 false,-1 是 true),所以通配符对搜索并帮不上什么忙。例如,准则 =-1"Like *1"返回的结果是一样的。

  • OLE Object 字段不能查询。

结果类型Boolean

2     _(下划线)   任何单个字符
示例:WHERE   au_fname   LIKE   '_ean '   将查找以   ean   结尾的所有   4   个字母的名字(Dean、Sean   等)。

用包含通配符的查询语句(select)搜索 Date/Time 字段

结果值如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。

3       []   指定范围中的任何单个字符
示例:WHERE   au_lname   LIKE   '[C-P]arsen '   将查找以arsen   结尾且以介于   C   与   P   之间的任何单个字符开始的   作者姓氏,例如,Carsen、Larsen、Karsen   等

对 Date/Time 字段进行搜索的查询语句里可以使用通配符,但要记住一个关键点:跟 Find and Replace 对话框不一样,查询不考虑格式的问题。

注释当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随

4   [^]     不属于指定范围中的任何单个字符,与   []   相反
示例:WHERE   au_lname   LIKE   'de[^l]% '   将查找以   de   开始且其后的字母不为   l   的所有作者的姓氏。

比如查询的准则写成 Like "*10*" 。返回的结果有的看上去包含 10,比如 10-Jul-1996; 但有的返回记录看上去不包含 10,比如 03-Oct-1997。为什么呢?因为在格利高里(Gregorian)历里,October 是第十个月 。当你在查询语句里使用通配符的时候,Access 是不管字段的格式的。我们可以把 Date/Time 字段的格式去掉后再比较一下查询的返回结果。

空格。如果查询中的比较要返回包含abc 的所有行,则将不会

一   使用   like   的模式匹配:
在搜索Datetime类型时,建议使用like   .
LIKE   支持   ASCII   模式匹配和   Unicode   模式匹配。当所有参数,包括   match_expression、pattern   和   escape_character(如果有)都是   ASCII   字符数据类型时,将执行   ASCII   模式匹配。如果其中任何参数属于   Unicode   数据类型,则所有参数将被转换为   Unicode   并执行   Unicode   模式匹配。当对   Unicode   数据(nchar   或   nvarchar   数据类型)使用   LIKE   时,尾随空格是有意义的。但是对于非   Unicode   数据,尾随空格没有意义。Unicode   LIKE   与   SQL-92   标准兼容。ASCII   LIKE   与   SQL   Server   的早期版本兼容

通配符的最大用处是用 Like 操作符进行模糊查询,Like 操作符把表中字符串类型的字段跟某个模式进行比较。

返回包含abc的列所在行。但是可以忽略模式所要匹配的表达式

二   使用   %   通配符

语法: expression  Likepattern

中的尾随空格。如果查询中的比较要返回包含abc的所有行,则

例如,此查询将显示数据库中所有的系统表,因为它们都以字母   sys   开始:
SELECT   TABLE_NAME
FROM   INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME   LIKE   'sys% '
若要查阅非系统表的所有对象,请使用   NOT   LIKE   'sys% '。如果共有   32   个对象且   LIKE   找到   13   个与模式匹配的名称,则   NOT   LIKE   将找到   19   个与   LIKE   模式不匹配的对象

语法部分 描述
expression SQL 表达式,往往出现在 WHERE 子句里,也可以出现在 Join On 子句里。通常是表字段名 ,或者是字段 名作参数的函数。
pattern 模式文本字符串,表达式字符串跟它做比较。

将返回以abc开始且具有零个或多个尾随空格的所有行。

三   使用escape字句的模式匹配

说明:

由于数据存储方式的原因,使用包含 char 和 varchar 数据模式的字符串比较可能无

可搜索包含一个或多个特殊通配符的字符串。例如,customers   数据库中的   discounts   表可能存储含百分号   (%)   的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供   ESCAPE   关键字和转义符。例如,一个样本数据库包含名为   comment   的列,该列含文本   30%。若要搜索在   comment   列中的任何位置包含字符串   30%   的任何行,请指定由   WHERE   comment   LIKE   '%30!%% '   ESCAPE   '! '   组成的   WHERE   子句。如果不指定   ESCAPE   和转义符,SQL   Server   将返回所有含字符串   30   的行。

Like 操作符可以在字段里找出匹配指定模式的值。模式可以是一个很明确的值 (例如, Like “Smith”),或者包含通配符来查找一系列值 (例如,Like “Sm*”).

法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分

下例使用   ESCAPE   子句和转义符查找   mytbl2   表的   c1   列中的精确字符串   10-15%

在下面的例子中,比较结果返回 P 打头,第二个字符是 A-F 中任意一个,再跟着 3 个数字的数据。

重要。下面的示例将局部 char 变量传递给存储过程,然后使用模式匹配查找某个作者

USE   pubs
GO
IF   EXISTS(SELECT   TABLE_NAME   FROM   INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME   =   'mytbl2 ')
DROP   TABLE   mytbl2
GO
USE   pubs
GO
CREATE   TABLE   mytbl2
(
c1   sysname
)
GO
INSERT   mytbl2   VALUES   ( 'Discount   is   10-15%   off ')
INSERT   mytbl2   VALUES   ( 'Discount   is   .10-.15   off ')
GO
SELECT   c1 
FROM   mytbl2
WHERE   c1   LIKE   '%10-15!%   off% '   ESCAPE   '! '
GO

Like “P[A-F]###”

的所有著作。在此过程中,作者的姓将作为变量传递。

四   使用   []   通配符

下表列出 Like 操作符跟不同模式进行比较的结果:

CREATE PROCEDURE find_books @AU_LNAME char(20)ASSELECT @AU_LNAME = RTRIM

下例查找姓为   Carson、Carsen、Karson   或   Karsen   的作者所在的行。
USE   pubs
SELECT   au_lname,   au_fname,   phone
FROM   authors
WHERE   au_lname   LIKE   '[CK]ars[eo]n '
ORDER   BY   au_lname   ASC,   au_fname   ASC

匹配类型 模式 匹配的值 不匹配的值
多个字符 a*a aa, aBa, aBBBa aBC
  *ab* abc, AABB, Xab aZb, bac
特殊字符 a[*]a a*a aaa
多个字符 ab* abcdefg, abc cab, aab
单个字符 a?a aaa, a3a, aBa aBBBa
单个数字 a#a a0a, a1a, a2a aaa, a10a
在某个字符范围内 [a-z] f, p, j 2, &
不在某个字符范围内 [!a-z] 9, &, % b, a
不是数字 [!0-9] A, a, &, ~ 0, 1, 9
综合 a[!b-m]# An9, az0, a99 abc, aj0

(@AU_LNAME) + '%'SELECT t.title_id, t.title FROM authors a, titleauthor ta,

模式匹配的注意事项:

titles tWHERE a.au_id = ta.au_id AND ta.title_id = t.title_id AND

  • 连线号(-)出现在模式字符串最前面或最后面的位置用来匹配它自己(前面允许出现感叹号!)。出现在其它位置时则用 来表 示 ANSI 字符集的范围。
  • 指定字符范围时,一定要用升序 (A-Z 或 0-100)。[A-Z] 是有效的,但 [Z-A] 则是无效的。
  • [ ] 被认为是零长字符串("")。

a.au_lname LIKE @AU_LNAME当名字中包含的字符数小于 20 时,char 变量

MS SQL Server 2000 及以上的通配符

(@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中没有行返回。由于

SQL Server 中 Like 操作符的语法跟 Access 中略有不同:

au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此

语法 match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

过程失败。

参数

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

match_expression 任何字符串数据类型的有效 SQL Server 表达式。

USE pubsGOCREATE PROCEDURE find_books2 @au_lname varchar(20)ASSELECT

pattern match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

t.title_id, t.title FROM authors a, titleauthor ta, titles tWHERE a.au_id =

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 WHERE title LIKE '%computer%' 将查找处于书名任意位置的包含单词 computer 的所有 书名。
_(下划线) 任何单个字符。 WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字(Dean、 Sean 等)。
[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE '[C-P]arsen' 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname LIKE 'de[^l]%' 将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

ta.au_id AND ta.title_id = t.title_id AND a.au_lname LIKE @au_lname +

escape_character 字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。 escape_character 没有默认值,且必须仅包含一个字符。

'%'EXEC find_books2 'ring'下面是结果集:

结果类型 Boolean

title_id title

结果值 如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。


注释

----------MC3021 The Gourmet Microwave

模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹 配。然而,可使用 字符串的任意片段匹配通配符。与使用 = 和 != 字符串比较运算符相比,使用通配符可 使 LIKE 运算符更加灵活。如果任何 参数都不属于字符串数据类型,SQL Server 会将其转换成字 符串数据类型(如果可能)。

PS2091 Is Anger the Enemy

当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含 "abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

PS2091 Is Anger the Enemy

由于数据存储方式的原因,数据类型是 charvarchar 的字符串可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。

PS2106 Life Without Fear

CREATE PROCEDURE find_books @AU_LNAME char(20) AS SELECT @AU_LNAME = RTRIM(@AU_LNAME) + '%' SELECT t.title_id, t.title  FROM authors a, titleauthor ta, titles t WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id    AND a.au_lname LIKE @AU_LNAME

(4 row(s)

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。

affected)使用 LIKE 的模式匹配当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

例如,如果将值 19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE

USE pubs GO CREATE PROCEDURE find_books2 @au_lname varchar(20) AS SELECT t.title_id, t.title  FROM authors a, titleauthor ta, titles t WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id    AND a.au_lname LIKE @au_lname + '%'     EXEC find_books2 'ring'

arrival_time = 9:20 将无法找到 9:20 字符串的精确匹配,因为 SQL Server 将其转

下面是结果集:

换为 1900 年 1 月 1 日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%'

title_id title  -------- --------------------------------------------------------------- MC3021   The Gourmet Microwave   PS2091   Is Anger the Enemy?  PS2091   Is Anger the Enemy?  PS2106   Life Without Fear  (4 row(s) affected)

将找到匹配。

当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值 19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到 9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日 上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%' 将找到匹配。  

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数,包括

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数,包括 match_expressionpatternescape_character(如果有)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果其中任何参数属于 Unicode 数据类型,则所有参数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据 (ncharnvarchar 数据类型)使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据,尾随空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL Server 的早期版本兼容 。

match_expression、pattern 和 escape_character都是 ASCII 字符数据类

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:

型时,将执行 ASCII 模式匹配。如果其中任何参数属于 Unicode 数据类型,则所有参

-- ASCII pattern matching with char column CREATE TABLE t (col1 char(30)) INSERT INTO t VALUES ('Robert King') SELECT *  FROM t  WHERE col1 LIKE '% King'   -- returns 1 row

-- Unicode pattern matching with nchar column CREATE TABLE t (col1 nchar(30)) INSERT INTO t VALUES ('Robert King') SELECT *  FROM t  WHERE col1 LIKE '% King'   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM CREATE TABLE t (col1 nchar (30)) INSERT INTO t VALUES ('Robert King') SELECT *  FROM t  WHERE RTRIM (col1) LIKE '% King' -- returns 1 row

数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据

说明  如果使用 LIKE 进行 字符 串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。

,尾随空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL

可以将通配符本身用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字和 [ ] 通 配符 的示例。

Server 的早期版本兼容。

符号 含义
LIKE '5[%]' 5%
LIKE '[_]n' _n
LIKE '[a-cdf]' a、b、c、d 或 f
LIKE '[-acdf]' -、a、c、d 或 f
LIKE '[ [ ]' [
LIKE ']' ]
LIKE 'abc[_]d%' abc_d 和 abc_de
LIKE 'abc[def]' abcd、abce 和 abcf

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之

使用 ESCAPE 子句的模式匹配

间的差异:

可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分号 (%) 的折扣值。若要搜索作为常规字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符 。例如,一个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,请指定由 WHERE comment LIKE '%30!%%' ESCAPE '!' 组成的 WHERE 子句。如果不指定 ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

-- ASCII pattern matching with char columnCREATE TABLE t (col1 char(30))

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased":

INSERT INTO t VALUES ('Robert King')SELECT * FROM t WHERE col1 LIKE '% King'

USE pubs GO SELECT notes FROM titles WHERE notes LIKE '50%% off when 100 or more copies are purchased'     ESCAPE '%' GO

-- returns 1 row-- Unicode pattern matching with nchar columnCREATE TABLE

下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10- 15%。

t (col1 nchar(30))INSERT INTO t VALUES ('Robert King')SELECT * FROM t WHERE

USE pubs GO IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES           WHERE TABLE_NAME = 'mytbl2')    DROP TABLE mytbl2 GO USE pubs GO CREATE TABLE  mytbl2 (  c1 sysname ) GO INSERT mytbl2 VALUES ('Discount is 10-15% off') INSERT mytbl2 VALUES ('Discount is .10-.15 off') GO SELECT c1  FROM mytbl2 WHERE c1 LIKE '%10-15!% off%' ESCAPE '!' GO

col1 LIKE '% King' -- no rows returned-- Unicode pattern matching with

使用 [ ] 通配符的例子

nchar column and RTRIMCREATE TABLE t (col1 nchar (30))INSERT INTO t VALUES

下例查找名字为 Cheryl 或 Sheryl 的作者。

('Robert King')SELECT * FROM t WHERE RTRIM(col1) LIKE '% King' -- returns

USE pubs GO SELECT au_lname, au_fname, phone FROM authors WHERE au_fname LIKE '[CS]heryl' ORDER BY au_lname ASC, au_fname ASC GO

1 row说明 如果使用 LIKE 进行字符串比较,模式字符串中的所有字符都有意义,包

下例查找姓为 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

括起始空格或尾随空格。

USE pubs GO SELECT au_lname, au_fname, phone FROM authors WHERE au_lname LIKE '[CK]ars[eo]n' ORDER BY au_lname ASC, au_fname ASC GO

使用 % 通配符如果指定 LIKE '5%',SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

Oracle 中通配符的使用情况

例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys 开始:

  用于where比较条件的有:

SELECT TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE TABLE_NAME LIKE 'sys%'

  等于:=、<、<=、>、>=、<>

说明 请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储

  包含:in、not in exists、not exists

过程处理 SQL Server 系统表。

  范围:between……and、not between……and

若要查阅非系统表的所有对象,请使用 NOT LIKE 'sys%'。如果共有 32 个对象且

  匹配测试:like、not like

LIKE 找到 13 个与模式匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配

  Null测试:is null、is not null

的对象。

  布尔链接:and、or、not

使用 LIKE '[^s][^y][^s]%' 模式不一定每次找到的名称都相同。可能仅得到 14 个名

  通配符:

称,除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个

  在where子句中,通配符可与like条件一起使用。在Oracle中:

字母为 s 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进

  %(百分号): 用来表示任意数量的字符,或者可能根本没有字符。

行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除

  _(下划线): 表示确切的未知字符。

  ?(问号): 用来表示确切的未知字符。

将通配符作为文字使用可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示

  #(井号): 用来表示确切的阿拉伯数字,0到9.

了使用 LIKE 关键字和 [ ] 通配符的示例。

  [a-d](方括号):用来表示字符范围,在这里是从a到d.

符号 含义 LIKE '5[%]' 5% LIKE '[_]n' _n LIKE '[a-cdf]' a、b、c、d 或 f LIKE '[-acdf]' -、a、c、d 或 f LIKE '[ [ ]' [ LIKE ']' ] LIKE 'abc[_]d%' abc_d 和 abc_de LIKE 'abc[def]' abcd、abce 和 abcf

  单引号('):在Oracle中,应该只使用单引号将文本和字符和日期括起来,不能使用引号(包括单双引号)将数字括起来。

使用 ESCAPE 子句的模式匹配可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts

  双引号("):在Oracle中,单双引号含义不同。双引号被用来将包含特定字符或者空格的列别名括起来。双引号还被用来将文本放入日期格式。

表可能存储含百分号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须

  撇号('):在Oracle中,撇号也可以写成彼此相邻的两个单引号。为了在供应商名字中间查找所有带撇号的供应商名字,可以这样编写代码:select * from l_suppliers where supplier_name like '%''%'

提供 ESCAPE 关键字和转义符。例如,一个样本数据库包含名为 comment 的列,该列

  &符号:在Oracle中,&符号常用来指出一个变量。例如,&fox是一个变量,稍微有点不同的一 种&& fox.每当&fox出现在Oracle脚本中时,都会要求您为它提供一个值。而使用&&fox,您只需要在& &fox第一次出现时为它提供变量值。如果想将&符号作为普通的符号使用,则应该关闭这个特性。要想关闭这个特性,可以运行以下的命令: set define off ,这是一个SQLplus命令,不是一个SQL命令。SQLplus设置了SQL在Oracle中运行的环境。

含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,请指定

  双竖线(||):Oracle使用双竖线表示字符串连接函数。

由 WHERE comment LIKE '%30!%%' ESCAPE '!' 组成的 WHERE 子句。如果不指定

  星号(*):select *意味着选择所有的列,count(*)意味着计算所有的行,表示通配符时,表示0个或任意多个字符。

ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

  正斜杠(/):在Oracle中,用来终止SQL语句。更准确的说,是表示了“运行现在位于缓冲区的SQL代码”。正斜杠也用作分隔项。

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串50% off when 100

  多行注释:/*……*/.

or more copies are purchased:

  不等于:有多种表达方式:!=、^=、<>、not xxx=yyy、not(xxx=yyy)

USE pubsGOSELECT notesFROM titlesWHERE notes LIKE '50%% off when 100 or more

oracle在Where子句中,可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录,以下是可使用的通配符:
%   零或者多个字符
_    单一任何字符(下划线)
     特殊字符

copies are purchased' ESCAPE '%'GO示例A. 使用带 % 通配符的 LIKE下例查找 authors 表中所有区号为 415 的电话号码。

 

USE pubsGOSELECT phoneFROM authorsWHERE phone LIKE '415%'ORDER by au_lnameGO

oracle10g以上支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹
配 'n' 或 'r'。
'.' 匹配除换行符之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'+' 匹配前面的子表达式一次或多次。
'*' 匹配前面的子表达式零次或多次。
'|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的
字符串。
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少
出现m次。
num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
各种操作符的运算优先级
转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
|
*/

下面是结果集:

其中关于条件,SQL提供了四种匹配模式:

phone ------------ 415 658-9932 415 548-7723 415 836-7128 415 986-

1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。

7020 415 836-7128 415 534-9219 415 585-4620 415 354-7128 415 834-2919 415

比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'

843-2991 415 935-4228 (11 row(s) affected)B. 使用带 % 通配符的 NOT LIKE下例查找 authors 表中所有区号不是 415 的电话号码。

将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

USE pubsGOSELECT phoneFROM authorsWHERE phone NOT LIKE '415%'ORDER BY

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'

au_lnameGO下面是结果集:

若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'
虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

phone ------------ 503 745-6402 219 547-9982 615 996-8275 615 297-

2,_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:

2723 707 938-6445 707 448-4982 408 286-2428 301 946-8853 801 826-0752 801

比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

826-0752 913 843-0462 408 496-7223 (12 row(s) affected)C. 使用 ESCAPE 子句下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10-15%。

再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三脚猫”这样name为三个字且第一个字是“三”的;

USE pubsGOIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

  1. regexp_like 正则表达式函数查询
    --查询FieldName中以1开头60结束的记录并且长度是7位
    select * from fzq where FieldName like '1____60';
    select * from fzq where regexp_like(FieldName,'1....60');
    --查询FieldName中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
    --使用like就不是很好实现了。
    select * from fzq where regexp_like(FieldName,'1[0-9]{4}60');
    -- 也可以这样实现,使用字符集。
    select * from fzq where regexp_like(FieldName,'1[[:digit:]]{4}60');
    -- 查询FieldName中不是纯数字的记录
    select * from fzq where not regexp_like(FieldName,'^[[:digit:]]+$');
    -- 查询FieldName中不包含任何数字的记录。
    select * from fzq where regexp_like(FieldName,'^[^[:digit:]]+$');
    --查询以12或者1b开头的记录.不区分大小写。
    select * from fzq where regexp_like(FieldName,'^1[2b]','i');
    --查询以12或者1b开头的记录.区分大小写。
    select * from fzq where regexp_like(FieldName,'^1[2B]');
    -- 查询数据中包含空白的记录。
    select * from fzq where regexp_like(FieldName,'[[:space:]]');
    --查询所有包含小写字母或者数字的记录。
    select * from fzq where regexp_like(FieldName,'^([a-z]+|[0-9]+)$');
    --查询任何包含标点符号的记录。
    select * from fzq where regexp_like(FieldName,'[[:punct:]]');

WHERE TABLE_NAME = 'mytbl2') DROP TABLE mytbl2GOUSE pubsGOCREATE TABLE

 

mytbl2( c1 sysname)GOINSERT mytbl2 VALUES ('Discount is 10-15% off')INSERT

 MySQL的通配符情况

mytbl2 VALUES ('Discount is .10-.15 off')GOSELECT c1 FROM mytbl2WHERE c1

 

LIKE '%10-15!% off%' ESCAPE '!'GOD. 使用 [ ] 通配符下例查找名字为 Cheryl 或 Sheryl 的作者。

 MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词)。
  第一种是标准的SQL模式匹配。它有2种通配符:“_”和“%”。“_”匹配任意单个字符,而“%”匹配任意多个字符(包括0个)。举例如下:

USE pubsGOSELECT au_lname, au_fname, phoneFROM authorsWHERE au_fname LIKE

SELECT * FROM table_name WHERE column_name LIKE 'm%'; #查询某字段中以m或M开头的所有记录
SELECT * FROM table_name WHERE column_name LIKE '%m%'; #查询某字段中包含m或M的所有记录
SELECT * FROM table_name WHERE column_name LIKE '%m'; #查询某字段中以m或M结尾的所有记录
SELECT * FROM table_name WHERE column_name LIKE '_m_'; #查询某字段中3个字符且m或M在中间的所有记录

'[CS]heryl'ORDER BY au_lname ASC, au_fname ASCGO下例查找姓为 Carson、Carsen

  如果我们想查询包含通配符的字符串该怎么办呢?比如,50%或_get。答案就是:转义。可以用来直接转义,或用ESCAPE定义转义字符来进行转义,都只是转义跟在后面的一个字符,例如:

、Karson 或 Karsen 的作者所在的行。

SELECT * FROM table_name WHERE column_name LIKE '%50%%'; /*第2个%被转义,查询某字段包含50%的所有记录*/
SELECT * FROM table_name WHERE column_name LIKE '%50/%%' ESCAPE '/'; #第2个%被转义
SELECT * FROM table_name WHERE column_name LIKE '%_get%' ESCAPE '/'; /*“_”被转义,查询某字段包含_get的所有记录*/

USE pubsGOSELECT au_lname, au_fname, phoneFROM authorsWHERE au_lname LIKE

  第二种是使用扩展正则表达式的模式匹配。先来看下扩展正则表达式一些字符的含义:
“.”:匹配任意单个字符
“?”:匹配前面的子表达式0次或1次。
“+”:匹配前面的子表达式1次或多次。
“*”:匹配前面的子表达式0次或多次。x*,表示0个或多个x字符;[0-9]*,匹配任何数量的数字。
“^”:表示匹配开始位置。
“$”:表示匹配结束位置。
“[]”:表示一个集合。[hi],表示匹配h或i;[a-d],表示匹配a、b、c、d中任一个。
“{}”:表示重复的次数。8{5},表示匹配5个8,即88888;[0-9]{5,11},表示匹配5到11个数字。
  再来看个例子:

'[CK]ars[eo]n'ORDER BY au_lname ASC, au_fname ASCGO请参见表达式

SELECT * FROM table_name WHERE column_name REGEXP '^50%{1,3}'; /*查询某字段中以50%、50%%或50%%%开头的所有记录*/

函数

 

SELECT

 

WHERE

======================================================================

下面看个高级搜索

 

基本条件查询

首先说说遇到的问题,在Access软件中写了一个带LIKE的SQL语句,可以正常执行,但是复制粘贴到ADO操作里面就出错了。其原因是这样的:如果 ADO所采用的数据库引擎是Microsoft Jet Engine,它是以Microsoft SQL Server为基础的,所以即使使用Access数据库作为数据源,也不能使用Access的SQL语法,而要采用SQL Server的语法,而它们的语法虽然很相像,但是还是有一些小区别,如LIKE语句。这是少数不能在本地测试SQL运行结果的情况之一。一个简单的解决 方案是在服务器条件允许的情况下采用Access OLE DB Provider作为数据库引擎。

比较运算符:,=,,=,=,!=

下面总结一下常见数据库系统LIKE子句匹配符的异同点:
1、匹配 单个字符 和 零到多个字符 的两种基本匹配符。
My SQL中使用_匹配单个字符,%匹配零到多个字符。
SQLite中使用_匹配单个字符,%匹配零到多个字符。
Oracle中使用_匹配单个字符,%匹配零到多个字符。
MS SQL中使用_匹配单个字符,%匹配零到多个字符。
Access中分为两种情况:
->Microsoft Jet引擎中使用_或?匹配单个字符,%或*匹配多个字符。
->Access软件和DAO中使用?匹配单个字符,*匹配多个字符。

between a and b,in(a,b,c),not exists,is null,like %_,or,and, any,all等

2、匹配 特定字符 的 复合匹配符
My SQL不支持复合匹配符,使用REGEXP(RLIKE)子句。
SQLite不支持复合匹配符,使用REGEXP子句。
Oracle中分为两种情况:
->Oracle 10g以前使用[]匹配特定字符,[^]匹配非特定字符。
->Oracle 10g之后不再支持符合匹配符,使用regexp_like函数。
MS SQL中使用[]匹配特定字符,[^]匹配非特定字符。
Access中使用[]匹配特定字符,[!]匹配非特定字符,#匹配任意数字(即[0-9])。

把某一字段中内容在特定范围内的记录查询出来

3、匹配 匹配符 的自身匹配符
My SQL中分为两种情况:
->当NO_BACKSLASH_ESCAPES未激活时使用%匹配%,_匹配_,\匹配,并支持ESCAPE子句修改转义符。
->当NO_BACKSLASH_ESCAPES被激活时无法匹配%和_,除非使用ESCAPE子句设置转义符。
SQLite中无法匹配%和_,除非使用ESCAPE子句设置转义符。
Oracle中使用[%]匹配%,[_]匹配_,[[]匹配[,并支持ESCAPE子句设置转义符。
MS SQL中使用[%]匹配%,[_]匹配_,[[]匹配[,并支持ESCAPE子句设置转义符。
Access中使用[%]匹配%(在需要时),[*]匹配*,[_]匹配_(在需要时),[?]匹配?,[[]匹配[。

SELECT StudentID, Score FROM SCore WHERE Score BETWEEN 60 AND 80

 

把某一字段中内容与所列出的查询内容列表匹配的记录查询出来

SELECT SName AS 学员姓名,SAddress As 地址 FROM Students WHERE SAddress IN ('

北京','广州','上海')

本文由葡京网投哪个正规发布于新葡亰-数据,转载请注明出处:中的通配符,有些正则表达式可以通过like实现

关键词:

上一篇:SQL注入天书之ASP注入漏洞全接触,SQL注入漏洞全接触

下一篇:mssqlserver中最大ID冲突解决办法,通过存储过程动态操作表中的列