模糊匹配
关键字:LIKE , SOUNDEX , DIFFERENCE
1. 模式匹配
在WHERE子句中使用LIKE操作符来查找针对列值的某个部分的匹配。LIKE + 通配符 来指定。
SELECT
MovieTitle AS ‘Movie’
FROM Movies
WHERE MovieTitle LIKE ‘%LOVE%’
查找电影名包含LOVE的电影(LOVE不区分大小写)。
%string表示字符string前面可以有任意多字符,string%表示string后面可以有任意多字符。即
以LOVE开头:LOVE%
以LOVE结尾:%LOVE
LOVE是单独一个单词而不作为名字中的开头或者结尾:% LOVE %
但注意如果是Oracle,是区分大小写的,通配符里面的字符严格匹配大小写,这和在SQL中使用本例是不一样的。一般等价的话,要在Oracle里面使用UPPER转换为全大写后进行匹配:
SELECT
MovieTitle AS ‘Movie’
FROM Movies
WHERE UPPER (MovieTitle) LIKE ‘%LOVE%’;
2. 通配符
除了 %,还有下划线 (_)、方括号[] 括起来的字符列表,以及用方括号[] 括起来的脱字符号加上字符列表。
通配符 |
含义 |
% |
任意多个字符(可以是没有字符) |
_ |
刚好1个字符(可以是任意的字符) |
[characterlist] |
出现在字符列表里面的1个字符(刚好1个) |
[^characterlist] |
没有出现在字符列表里面的1个字符(刚好1个) |
MySQL和Oracle里面没有后两种通配符。
‘_ARY’ Cary , Mary , Gray
‘[CM]ARY’ Cary , Mary
‘[^CG]ARY’ Mary
上面只能匹配以ARY结尾的单词。
与NOT使用:
SELECT
FirstName,
LastName
FROM Actors
WHERE FirstName LIKE ‘%ARY%’
AND FirstName NOT LIKE ‘ [MG]ARY’
NOT LIKE ‘ [MG]ARY’ 和 [^MG]ARY也是不同的,注意区分意义。
3. 按照读音匹配
SOUNDEX、DIFFERENCE
SELECT
SOUNDEX (‘Smith’) AS ‘Sound of Smith’
SOUNDEX (‘Smythe’) AS ‘Sound of Smythe’
结果:
Sound of Smith Sound of Smythe
---------------------------------------------
5530 5530
SOUNDEX返回4个字符的代码,表示短语的读音。代码相同说明读音相似。
DIFFERENCE (MySQL和Oracle没有DIFFERENCE函数)
SELECT
DIFFERENCE (‘Smith’, ‘Smythe’) AS ‘The Difference’
The Difference
--------------------
4
DIFFERENCE总是需要两个参数,先得到这两个参数的SOUNDEX值,再比较这两个值。返回4说明SOUNDEX值中的4个字符全部相等,返回0则字符中没有相等的值。因此,DIFFERENCE的值为4是最大可能的匹配。
SELECT
FirstName,
LastName
FROM Actors
WHERE DIFFERENCE (FirstName, ‘John’) = 4
在Actors表中查找FirstName读音和John非常相似的名字:
可能返回
FirstName LastName
Jon Voight
John Wayne