在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一起使用。
LIKE关键字共有四种通配符。
“%”代表“包含0个或更多字符的任意字符串”;
“—”代表“任何单个字符”;
“[]”代表“指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符”;
“[^]”代表“不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符”。
案例:
SELECT * FROM sysobjects WHERE [name] LIKE '%sys%'---包含字符串"sys"的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE 's_s_t_'---包含单词"s""s""t"并穿插一个任意单词的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE '_ysrowsets'---包含一个任意单词开头且以字符串"ysrowsets"结尾的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE 'j%s'---包含单词"j"开头"s"结尾的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE '[qe]%'---包含单词"q"或"e"开头的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE '[^djsmupftqe]%'---不包含单词"d,j,s,m,u,p,f,t,q,e"开头的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE '[^a-s]%'--不包含单词"a"到"s"开头的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE [name] LIKE '%[_]Ins'---包含单词"_Ins"并以此结尾的所有记录
/*或使用 CHARINDEX 或PATINDEX
返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
*/
UNION ALL
SELECT * FROM sysobjects WHERE CHARINDEX('%s1%',[name])> 0 ---包含单词"s1"的所有记录
UNION ALL
SELECT * FROM sysobjects WHERE PATINDEX('%s1%',[name])> 0 ---包含单词"s1"的所有记录
使用通配符可以编辑复杂的搜索字符串。假如要确定一个字符串是否包含字母A和Z,还有任何数字,这个PARINDEX函数命令可能像这样:
PATINDEX('%[A,Z,0-9]%[A,Z,0-9]%[A,Z,0-9]%','XYZABC123')
最后值得说明的是,在使用函数时 charindex > like > padindex 效率依次递减。
--------------------------------------------------------------------------------------------------------------------------------
%:匹配零个及多个任意字符; _:与任意单字符匹配; []:匹配一个范围; [^]:排除一个范围
Symbol | Meaning |
---|---|
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 '/'