SQL Like通配符
来源:互联网 发布:鬼子来了结局知乎 编辑:程序博客网 时间:2024/05/19 15:45
半角单引号
示例:查询备注字段包含半角单引号的所有学生信息。
select * from Students where desp like '%''%' 或select * from Students where desp like '%['']%'
通配符%之间的''和['']。其中,第一个'意即转义,第二个'意即真正的半角单引号。
LIKE通配符
确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用= 和 != 字符串比较运算符相比,使用通配符可使 LIKE运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft® SQL Server™ 会将其转换成字符串数据类型(如果可能)。
语法
match_expression [ NOT ] LIKEpattern [ ESCAPE escape_character ]
参数
match_expression
任何字符串数据类型的有效 SQL Server表达式。
pattern
match_expression中的搜索模式,可以包含下列有效 SQL Server通配符。
通配符
描述
示例
%
包含零个或更多字符的任意字符串。
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 的所有作者的姓氏。
escape_character
字符串数据类型分类中的所有数据类型的任何有效 SQL Server表达式。escape_character没有默认值,且必须仅包含一个字符。
结果类型
Boolean
结果值
如果match_expression 匹配指定模式,LIKE将返回 TRUE。
注释
当使用 LIKE进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc "(abc后有一个空格)的所有行,则将不会返回包含"abc"(abc后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。
由于数据存储方式的原因,使用包含char 和varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE比较失败的原因十分重要。下面的示例将局部 char变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。
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
当名字中包含的字符数小于 20时,char 变量 (@AU_LNAME)将包含尾随空格,这导致 find_books过程中没有行返回。由于 au_lname列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。
但下面的示例是成功的,因为尾随空格没有被添加到varchar 变量中:
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'
下面是结果集:
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)
使用 LIKE的模式匹配
当搜索datetime 值时,推荐使用 LIKE,因为datetime 项可能包含各种日期部分。例如,如果将值 19981231 9:20插入到名为 arrival_time 的列中,则子句 WHEREarrival_time = 9:20 将无法找到 9:20 字符串的精确匹配,因为 SQL Server将其转换为 1900 年 1 月 1日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%'将找到匹配。
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 的早期版本兼容。
下面的一系列示例显示 ASCII LIKE模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:
-- 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
说明 如果使用 LIKE进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。
使用 %通配符
如果指定 LIKE '5%',SQL Server将搜索后面带有零个或多个任意字符的数字 5。
例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys开始:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sys%'
说明 请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server系统表。
若要查阅非系统表的所有对象,请使用 NOT LIKE 'sys%'。如果共有 32个对象且 LIKE 找到 13 个与模式匹配的名称,则 NOT LIKE将找到 19 个与 LIKE 模式不匹配的对象。
使用 LIKE '[^s][^y][^s]%'模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19个),除了系统表名称外,所有以 s 开始或第二个字母为 y或第三个字母为 s 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。
将通配符作为文字使用
可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE关键字和 [ ] 通配符的示例。
符号
含义
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
使用 ESCAPE子句的模式匹配
可搜索包含一个或多个特殊通配符的字符串。例如,customers数据库中的 discounts 表可能存储含百分号 (%)的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一个样本数据库包含名为comment 的列,该列含文本 30%。若要搜索在comment 列中的任何位置包含字符串 30%的任何行,请指定由 WHERE comment LIKE '%30!%%' ESCAPE '!' 组成的 WHERE 子句。如果不指定 ESCAPE 和转义符,SQL Server将返回所有含字符串 30 的行。
下例说明如何在pubs 数据库 titles表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased":
USE pubs
GO
SELECT notes
FROM titles
WHERE notes LIKE '50%% off when 100 or more copies are purchased'
ESCAPE '%'
GO
示例
A.使用带 % 通配符的 LIKE
下例查找 authors表中所有区号为 415 的电话号码。
USE pubs
GO
SELECT phone
FROM authors
WHERE phone LIKE '415%'
ORDER by au_lname
GO
下面是结果集:
phone
------------
415 658-9932
415 548-7723
415 836-7128
415 986-7020
415 836-7128
415 534-9219
415 585-4620
415 354-7128
415 834-2919
415 843-2991
415 935-4228
(11 row(s) affected)
B.使用带 % 通配符的 NOT LIKE
下例查找authors 表中所有区号不是 415的电话号码。
USE pubs
GO
SELECT phone
FROM authors
WHERE phone NOT LIKE '415%'
ORDER BY au_lname
GO
下面是结果集:
phone
------------
503 745-6402
219 547-9982
615 996-8275
615 297-2723
707 938-6445
707 448-4982
408 286-2428
301 946-8853
801 826-0752
801 826-0752
913 843-0462
408 496-7223
(12 row(s) affected)
C.使用 ESCAPE 子句
下例使用 ESCAPE子句和转义符查找 mytbl2表的 c1 列中的精确字符串 10-15%。
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
D.使用 [ ] 通配符
下例查找名字为 Cheryl或 Sheryl 的作者。
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
下例查找姓为 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
- SQL LIKE 通配符
- SQL like相关通配符
- SQL like相关通配符
- SQL LIKE 通配符
- sql like通配符
- SQL LIKE 通配符随笔
- SQL Like 通配符
- SQL LIKE 通配符
- SQL LIKE 通配符
- SQL LIKE 通配符
- SQL LIKE 通配符
- SQL Like通配符
- SQL LIKE 通配符随笔
- SQL LIKE 通配符
- SQL LIKE 通配符
- SQL LIKE 通配符随笔
- SQL LIKE通配符
- SQL like通配符小结
- 服务器网速实时监控(shell脚本)
- 做什么开发赚钱
- 用位来保存信息
- Linux下Rtl8139too网卡设备驱动程序关键函数剖析
- Asp.net工程 发布,安装包
- SQL Like通配符
- IE的document.getElementById混淆name和id属性的BUG
- 彩色转灰度算法彻底学习
- 计算通话时间公式
- NFS 服务器的架设
- OA办公,ERP,SAP
- 午夜红酒
- VNC配置详解
- 猴子和香蕉问题